ちゃなべの備忘録

ほぼ備忘録です。

さくらVPSでサーバー間通信をやってみた【備忘録】

はじめに

これにいろいろ機能をつけてきた。 さぁ次はサーバー間通信かな。

localでのサーバー間通信はやってきたけど、本番環境でのサーバー間通信はやったことがない。 ワクワク。やっていこ!

前提イメージ

  • さくらVPSにサーバー間通信の機能があるっぽいけど、どうなんだろ。
    • なるべく「これ便利サービス」は使いたくない。
  • もしできなそうであればネットワークを構築する必要がありそうなので頑張るわ。

調査

vps.sakura.ad.jp

→ これでやるっぽい。こんな簡単にできるのか?

manual.sakura.ad.jp

→ manualはこれ。やってみるか。

phoenixknight.jp

→ やり始めまで参考

blog.tilfin.net

→ いまはようわからんけど、あとあと参考になりそう

qiita.com

→ 参考になりそう

w.atwiki.jp

→ クソ参考になりそう

cat-marketing.jp

→ まんまやん

検索方法はこれ [さくらVPS ローカル接続]

実装

他の人のサイトを見ながらやってみよう。

スイッチの作成

とりあえず作ってみた。

さくらVPSスイッチ作成 さくらVPSスイッチ作成2 さくらVPSスイッチ作成3

サーバー間通信を行うための、サーバー3つ(front, back, db)をシャットダウンする。

各サーバーに接続先スイッチを追加

サーバーの設定画面 > ネットワーク > ネットワークインターフェース から接続先を設定。
eth0は基本的にインターネットに接続するみたい。だからeth1をさっきのスイッチに設定。

だけどあとでbackサーバーとdbサーバーはeth0のインターネット接続を外す、必要ないしね。

さくらVPS接続先スイッチ設定

各サーバーのネットワーク設定

んで、いろいろみていたら、どうやらこの後はnmcliコマンドというものを使うっぽい。 そして、どうやらこっから先のさくらVPS関連の設定はなさげ? ということは [ nmcli サーバー間通信 ]とかで調べたら出てきそう。

調べてみたけど、やっぱりさくらVPSありきの設定ではありそう。local通信を行うために今回スイッチ作ったしね。

これらを参考にやってみる

cat-marketing.jp

manual.sakura.ad.jp

clientの設定

clientのサーバー入ってみて、設定ファイル見てみたらこうなっていた。ので編集した。

$ cat /etc/sysconfig/network-scripts/ifcfg-ens4
DEVICE=”ens4″
ONBOOT=”no”
TYPE=“Ethernet”

$ vi /etc/sysconfig/network-scripts/ifcfg-ens4
DEVICE="ens4"
ONBOOT=”yes”
TYPE=”Ethernet”
IPADDR=”192.168.1.1″
NETMASK=“255.255.255.0″

$ systemctl restart NetworkManager

けど、この後にpingで確認してもどうやらうまく設定できていないみたいだす。

$ nmcli networking off && nmcli connection reload && nmcli networking on
Error: failed to set networking: Not authorized to enable/disable networking
$ sudo nmcli networking off

あ、、やっちまったwww ネットワーク切ったからssh切れちゃった。 さくらVPSからコンソール入って、以下のコマンド打って再起動しました。 そしたらsshで入れた、よかったーー。

$ sudo nmcli connection reload 
$ sudo nmcli networking on

んーーーだけどやっぱり起動しない。というかconnection見てみたら消えてるし。deviceは残っている。じゃあ追加してみるか。

$ nmcli connection add type ethernet ifname ens4 con-name ens4
Connection 'ens4' successfully added.
$ nmcli connection
NAME         TYPE      DEVICE
ens4         ethernet  ens4
System ens3  ethernet  ens3
System ens5  ethernet  --
$ nmcli device
DEVICE  TYPE      STATE                                  CONNECTION
ens3    ethernet  connected                              System ens3
ens4    ethernet  connecting (getting IP configuration)  ens4
ens5    ethernet  disconnected                           --
lo      loopback  unmanaged                              -- 
$ nmcli device show ens4
GENERAL.DEVICE:                         ens4
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         ~~~~
GENERAL.MTU:                            1500
GENERAL.STATE:                          70 (connecting (getting IP configuration))
GENERAL.CONNECTION:                     ens4
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/4
WIRED-PROPERTIES.CARRIER:               on
IP4.GATEWAY:                            --
IP6.ADDRESS[1]:                         ~~~~
IP6.GATEWAY:                            --
IP6.ROUTE[1]:                           dst = fe80::/64, nh = ::, mt = 1024

おおーきた!! ん、ということはさっきのファイル直接編集はやっぱりしなくても良さげだな。connectionを一旦落として、addして、network設定すればよさげ。

というかこれ見てみたら、さっきの設定ファイル反映できてなくね? ....あとでそれはするとしてIP6のアドレス設定しかできてないからちょっとnmcliコマンドで修正しよう。

$ sudo nmcli connection modify ens4 ipv4.method manual ipv4.addresses "192.168.1.1/24" ipv6.method "ignore" connection.autoconnect yes
[rocky@ik1-443-53839 ~]$ nmcli device
DEVICE  TYPE      STATE         CONNECTION
ens3    ethernet  connected     System ens3
ens4    ethernet  connected     ens4
ens5    ethernet  disconnected  --
lo      loopback  unmanaged     --
[rocky@ik1-443-53839 ~]$ nmcli device show ens4
GENERAL.DEVICE:                         ens4
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         ~~~~~
GENERAL.MTU:                            1500
GENERAL.STATE:                          100 (connected)
GENERAL.CONNECTION:                     ens4
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/15
WIRED-PROPERTIES.CARRIER:               on
IP4.ADDRESS[1]:                         192.168.1.1/24
IP4.GATEWAY:                            --
IP4.ROUTE[1]:                           dst = 192.168.1.0/24, nh = 0.0.0.0, mt = 101
IP6.GATEWAY:                            --

できているっぽいな。設定ファイルどうなったんかな。

$ cat /etc/sysconfig/network-scripts/ifcfg-ens4
DEVICE="ens4"
ONBOOT=”yes”
TYPE=”Ethernet”
IPADDR=”192.168.1.1″
NETMASK=“255.255.255.0

なんにも変わってないな。ええーー。サービス再起動してみるか。 ....変わらん。。 えぇ。。じゃあ設定ファイルもとに戻して、再起動して、pingしてみるか。

$ vi /etc/sysconfig/network-scripts/ifcfg-ens4
DEVICE=”ens4″
ONBOOT=”no”
TYPE=“Ethernet”

$ nmcli networking off && nmcli connection reload && nmcli networking on
$ ping -c 10 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.015 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.032 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.030 ms
64 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=0.026 ms
64 bytes from 192.168.1.1: icmp_seq=5 ttl=64 time=0.029 ms
64 bytes from 192.168.1.1: icmp_seq=6 ttl=64 time=0.030 ms
64 bytes from 192.168.1.1: icmp_seq=7 ttl=64 time=0.038 ms
64 bytes from 192.168.1.1: icmp_seq=8 ttl=64 time=0.029 ms
64 bytes from 192.168.1.1: icmp_seq=9 ttl=64 time=0.031 ms
64 bytes from 192.168.1.1: icmp_seq=10 ttl=64 time=0.027 ms

--- 192.168.1.1 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9230ms
rtt min/avg/max/mdev = 0.015/0.028/0.038/0.005 ms

うん、まぁいいんかな。 じゃあこれで他のサーバーも同じ設定でいこか。

backの設定

さっきと違う方法でやってみよう。

$ nmcli connection
NAME         UUID                                  TYPE      DEVICE
System ens3  21d47e65-8523-1a06-af22-6f121086f085  ethernet  ens3
System ens4  e27f182b-d125-2c43-5a30-43524d0229ac  ethernet  --
System ens5  8126c120-a964-e959-ff98-ac4973344505  ethernet  --

$ nmcli connection modify e27f182b-d125-2c43-5a30-43524d0229ac connection.id ens4
$ nmcli connection
NAME         UUID                                  TYPE      DEVICE
System ens3  21d47e65-8523-1a06-af22-6f121086f085  ethernet  ens3
ens4         e27f182b-d125-2c43-5a30-43524d0229ac  ethernet  --
System ens5  8126c120-a964-e959-ff98-ac4973344505  ethernet  --

$ nmcli connection modify ens4 ipv4.method manual ipv4.addresses "192.168.1.2/24" ipv6.method "ignore" connection.autoconnect yes
$ nmcli connection
NAME         UUID                                  TYPE      DEVICE
System ens3  21d47e65-8523-1a06-af22-6f121086f085  ethernet  ens3
ens4         e27f182b-d125-2c43-5a30-43524d0229ac  ethernet  --
System ens5  8126c120-a964-e959-ff98-ac4973344505  ethernet  --
$ nmcli device
DEVICE  TYPE      STATE         CONNECTION
ens3    ethernet  connected     System ens3
ens4    ethernet  disconnected  --
ens5    ethernet  disconnected  --
lo      loopback  unmanaged     --

$ nmcli networking off && nmcli connection reload && nmcli networking on
$ nmcli connection
NAME         UUID                                  TYPE      DEVICE
System ens3  21d47e65-8523-1a06-af22-6f121086f085  ethernet  ens3
ens4         e27f182b-d125-2c43-5a30-43524d0229ac  ethernet  --
System ens5  8126c120-a964-e959-ff98-ac4973344505  ethernet  --

$ nmcli connection up ens4
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
$ nmcli connection
NAME         UUID                                  TYPE      DEVICE
System ens3  21d47e65-8523-1a06-af22-6f121086f085  ethernet  ens3
ens4         e27f182b-d125-2c43-5a30-43524d0229ac  ethernet  ens4
System ens5  8126c120-a964-e959-ff98-ac4973344505  ethernet  --
$ nmcli device show ens4
GENERAL.DEVICE:                         ens4
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         ~~~~~
GENERAL.MTU:                            1500
GENERAL.STATE:                          100 (connected)
GENERAL.CONNECTION:                     ens4
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/3
WIRED-PROPERTIES.CARRIER:               on
IP4.ADDRESS[1]:                         192.168.1.2/24
IP4.GATEWAY:                            --
IP4.ROUTE[1]:                           dst = 192.168.1.0/24, nh = 0.0.0.0, mt = 101
IP6.GATEWAY:                            --

お、できたっぽい。たぶん以下のことをすると設定できるかな。

  • nmcli connection up をしてつなぐ
  • プライベートaddressの設定はするべき
  • networkingの再起動はいるかわからん
  • nmcli connection reloadはファイルを読む感じだから関係なさそう

じゃあpingで他のアドレスとも繋がっているか確認しよう。

$ ping -c 10 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.018 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.031 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.031 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.038 ms
64 bytes from 192.168.1.2: icmp_seq=5 ttl=64 time=0.036 ms
64 bytes from 192.168.1.2: icmp_seq=6 ttl=64 time=0.038 ms
64 bytes from 192.168.1.2: icmp_seq=7 ttl=64 time=0.030 ms
64 bytes from 192.168.1.2: icmp_seq=8 ttl=64 time=0.039 ms
64 bytes from 192.168.1.2: icmp_seq=9 ttl=64 time=0.032 ms
64 bytes from 192.168.1.2: icmp_seq=10 ttl=64 time=0.031 ms

--- 192.168.1.2 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9200ms
rtt min/avg/max/mdev = 0.018/0.032/0.039/0.005 ms

$ ping -c 10 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.355 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.202 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.183 ms
64 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=0.282 ms
64 bytes from 192.168.1.1: icmp_seq=5 ttl=64 time=0.418 ms
64 bytes from 192.168.1.1: icmp_seq=6 ttl=64 time=0.160 ms
64 bytes from 192.168.1.1: icmp_seq=7 ttl=64 time=0.325 ms
64 bytes from 192.168.1.1: icmp_seq=8 ttl=64 time=0.294 ms
64 bytes from 192.168.1.1: icmp_seq=9 ttl=64 time=0.459 ms
64 bytes from 192.168.1.1: icmp_seq=10 ttl=64 time=0.233 ms

--- 192.168.1.1 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9221ms
rtt min/avg/max/mdev = 0.160/0.291/0.459/0.094 ms

$ ping -c 10 192.168.1.3
PING 192.168.1.3 (192.168.1.3) 56(84) bytes of data.
From 192.168.1.2 icmp_seq=1 Destination Host Unreachable
From 192.168.1.2 icmp_seq=2 Destination Host Unreachable
From 192.168.1.2 icmp_seq=3 Destination Host Unreachable
From 192.168.1.2 icmp_seq=4 Destination Host Unreachable
From 192.168.1.2 icmp_seq=5 Destination Host Unreachable
From 192.168.1.2 icmp_seq=6 Destination Host Unreachable
From 192.168.1.2 icmp_seq=7 Destination Host Unreachable
From 192.168.1.2 icmp_seq=8 Destination Host Unreachable
From 192.168.1.2 icmp_seq=9 Destination Host Unreachable
From 192.168.1.2 icmp_seq=10 Destination Host Unreachable

--- 192.168.1.3 ping statistics ---
10 packets transmitted, 0 received, +10 errors, 100% packet loss, time 9199ms
pipe 4

おおーーー。ちゃんと自身のアドレスにpingできるだけじゃなくて、clientサーバー(192.1681.1)へpingもちゃんと送れてる。そして、まだ設定していないアドレス(192.168.1.3)には送れていない。

やりたいことできてるぅ!!

dbの設定

次は検証も含めて設定していこう。

$ nmcli connection modify e27f182b-d125-2c43-5a30-43524d0229ac connection.id ens4
$ nmcli connection up ens4
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
$ nmcli connection
NAME         UUID                                  TYPE      DEVICE
System ens3  21d47e65-8523-1a06-af22-6f121086f085  ethernet  ens3
ens4         e27f182b-d125-2c43-5a30-43524d0229ac  ethernet  ens4
System ens5  8126c120-a964-e959-ff98-ac4973344505  ethernet  --
$ nmcli device show ens4
GENERAL.DEVICE:                         ens4
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         9C:A3:BA:08:67:56
GENERAL.MTU:                            1500
GENERAL.STATE:                          100 (connected)
GENERAL.CONNECTION:                     ens4
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/2
WIRED-PROPERTIES.CARRIER:               on
IP4.GATEWAY:                            --
IP6.GATEWAY:                            --

あーーーやっぱり起動はするし、つながりもするっぽいな。 だけど、private addressの設定指定なからこのままだとダメだね。

じゃあprivate addressの設定をしていこう。

$ nmcli connection down ens4
Connection 'ens4' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
$ nmcli connection
NAME         UUID                                  TYPE      DEVICE
System ens3  21d47e65-8523-1a06-af22-6f121086f085  ethernet  ens3
ens4         e27f182b-d125-2c43-5a30-43524d0229ac  ethernet  --
System ens5  8126c120-a964-e959-ff98-ac4973344505  ethernet  --

$ nmcli connection modify ens4 ipv4.method manual ipv4.addresses "192.168.1.3/24" ipv6.method "ignore" connection.autoconnect yes
$ nmcli connection up ens4
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
$ nmcli connection
NAME         UUID                                  TYPE      DEVICE
System ens3  21d47e65-8523-1a06-af22-6f121086f085  ethernet  ens3
ens4         e27f182b-d125-2c43-5a30-43524d0229ac  ethernet  ens4
System ens5  8126c120-a964-e959-ff98-ac4973344505  ethernet  --
$ nmcli device show ens4
GENERAL.DEVICE:                         ens4
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         9C:A3:BA:08:67:56
GENERAL.MTU:                            1500
GENERAL.STATE:                          100 (connected)
GENERAL.CONNECTION:                     ens4
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/3
WIRED-PROPERTIES.CARRIER:               on
IP4.ADDRESS[1]:                         192.168.1.3/24
IP4.GATEWAY:                            --
IP4.ROUTE[1]:                           dst = 192.168.1.0/24, nh = 0.0.0.0, mt = 101
IP6.GATEWAY:                            --

よし、できた。じゃあpingで確認する。

$ ping -c 5 192.168.1.3
PING 192.168.1.3 (192.168.1.3) 56(84) bytes of data.
64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=0.045 ms
64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=0.040 ms
64 bytes from 192.168.1.3: icmp_seq=4 ttl=64 time=0.032 ms
64 bytes from 192.168.1.3: icmp_seq=5 ttl=64 time=0.033 ms

--- 192.168.1.3 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4124ms
rtt min/avg/max/mdev = 0.032/0.036/0.045/0.005 ms

$ ping -c 5 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.391 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.235 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.181 ms
64 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=0.211 ms
64 bytes from 192.168.1.1: icmp_seq=5 ttl=64 time=0.267 ms

--- 192.168.1.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4115ms
rtt min/avg/max/mdev = 0.181/0.257/0.391/0.072 ms

$ ping -c 5 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.290 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.219 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=3.83 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=5.86 ms
64 bytes from 192.168.1.2: icmp_seq=5 ttl=64 time=0.294 ms

--- 192.168.1.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4075ms
rtt min/avg/max/mdev = 0.219/2.098/5.856/2.331 ms

$ ping -c 5 192.168.1.4
PING 192.168.1.4 (192.168.1.4) 56(84) bytes of data.
From 192.168.1.3 icmp_seq=1 Destination Host Unreachable
From 192.168.1.3 icmp_seq=2 Destination Host Unreachable
From 192.168.1.3 icmp_seq=3 Destination Host Unreachable
From 192.168.1.3 icmp_seq=4 Destination Host Unreachable
From 192.168.1.3 icmp_seq=5 Destination Host Unreachable

--- 192.168.1.4 ping statistics ---
5 packets transmitted, 0 received, +5 errors, 100% packet loss, time 4083ms
pipe 4

いいねーー。ちゃんと自身と設定したサーバーには繋がって、それ以外には繋がらないっぽい。

サーバー同士の接続アドレス変更

じゃああとは、アドレスの向き先を変えればいいんかな?

  1. backとclientの接続
  2. dbとbackの接続

この二つを修正していこう。

backとclientの接続

clientからbackにapiを要求する時のアドレスを変えてみる。 このときはまだサーバーとdbはパブリックアドレスでつながっている。

まずはcurlコマンドで要求できるか確認する。

$ curl http:/192.168.1.2:8080/shops
{
    "message": "get shops",
    "shops": [
        {
            "ID": 5,
            "CreatedAt": "2023-01-15T07:40:33+09:00",
            "UpdatedAt": "2023-01-15T07:40:33+09:00",
            "DeletedAt": null,
            "Name": "test",
            "Description": "test"
        },
        {
            "ID": 7,
            "CreatedAt": "2023-01-21T23:23:37+09:00",
            "UpdatedAt": "2023-01-21T23:23:37+09:00",
            "DeletedAt": null,
            "Name": "test",
            "Description": "test"
        },
        {
            "ID": 8,
            "CreatedAt": "2023-03-05T18:28:01+09:00",
            "UpdatedAt": "2023-03-05T18:28:01+09:00",
            "DeletedAt": null,
            "Name": "牛角",
            "Description": "焼肉食べ放題ならここしかない。"
        }
    ]
}

完璧。じゃあ、コードを変えてみよう。

envファイルを変えてscpで送信してnginxを再起動してみる。

REACT_APP_SERVER_URL='http://192.168.1.2:8080'
$ scp services/client/app/.env.production rocky@133.125.51.93:/usr/local/src/app
.env.production                                                                     100%   46     1.4KB/s   00:00
$ ssh nabelog_client
$ cd /usr/local/src/app
$ sudo systemctl restart nginx

あれ、だけどlog見てみてもどうにも切り替わっていない。もしかしてbuildファイルにenvも含まれる系かな?いや、だけどCDでbuildするけどgithubにenvは持っていっていないし。

だとすると再起動ミスか?一回CD回してみて、それでもダメだったらサーバーを再起動してみよう。

.... ↓

一回CDしてみたけどダメだ。サーバーを再起動してみます。

... ↓

サーバー再起動してもダメだ。え、なんでだろ。 あーーproxyだ。package.jsonのproxy設定が前の状態になってるわ。

えーーこれ環境によって変えたいんだけど、どうしよう。。 んーーまぁとりあえずハードコーディングで変えましょか。

  "proxy": "http://パブリックアドレス:8080",
  ↓
  "proxy": "http://192.168.1.2:8080",

そして、再度npm installしてCDを再度回してみる。

[rocky@ik1-443-53839 app]$ npm install
(#########⠂⠂⠂⠂⠂⠂⠂⠂⠂) ⠹ reify:fsevents: sill reify mark deleted [ '/usr/local/src/app/node_modules/fsevents' ]
<--- Last few GCs --->

[1816:0x5ef0630]   140346 ms: Scavenge (reduce) 248.1 (256.9) -> 248.0 (257.4) MB, 10.7 / 0.0 ms  (average mu = 0.381, current mu = 0.368) allocation failure
[1816:0x5ef0630]   140408 ms: Scavenge (reduce) 248.6 (257.4) -> 248.4 (257.7) MB, 4.6 / 0.0 ms  (average mu = 0.381, current mu = 0.368) allocation failure
[1816:0x5ef0630]   140459 ms: Scavenge (reduce) 249.0 (257.7) -> 248.8 (258.2) MB, 9.0 / 0.0 ms  (average mu = 0.381, current mu = 0.368) allocation failure


<--- JS stacktrace --->

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 0xb09c10 node::Abort() [npm install]
 2: 0xa1c193 node::FatalError(char const*, char const*) [npm install]
 3: 0xcf8dbe v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [npm install]
 4: 0xcf9137 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [npm install]
 5: 0xeb09d5  [npm install]
 6: 0xeb14b6  [npm install]
 7: 0xebf9de  [npm install]
 8: 0xec0420 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [npm install]
 9: 0xec339e v8::internal::Heap::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [npm install]
10: 0xe84612 v8::internal::Factory::AllocateRaw(int, v8::internal::AllocationType, v8::internal::AllocationAlignment) [npm install]
11: 0xe7cc24 v8::internal::FactoryBase<v8::internal::Factory>::AllocateRawWithImmortalMap(int, v8::internal::AllocationType, v8::internal::Map, v8::internal::AllocationAlignment) [npm install]
12: 0xe7ee82 v8::internal::FactoryBase<v8::internal::Factory>::NewDescriptorArray(int, int, v8::internal::AllocationType) [npm install]
13: 0x10cced7 v8::internal::DescriptorArray::CopyUpTo(v8::internal::Isolate*, v8::internal::Handle<v8::internal::DescriptorArray>, int, int) [npm install]
14: 0x10bb011 v8::internal::Map::CopyAddDescriptor(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Map>, v8::internal::Descriptor*, v8::internal::TransitionFlag) [npm install]
15: 0x10bb5cc v8::internal::Map::CopyWithField(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Map>, v8::internal::Handle<v8::internal::Name>, v8::internal::Handle<v8::internal::FieldType>, v8::internal::PropertyAttributes, v8::internal::PropertyConstness, v8::internal::Representation, v8::internal::TransitionFlag) [npm install]
16: 0x10bd3f8 v8::internal::Map::TransitionToDataProperty(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Map>, v8::internal::Handle<v8::internal::Name>, v8::internal::Handle<v8::internal::Object>, v8::internal::PropertyAttributes, v8::internal::PropertyConstness, v8::internal::StoreOrigin) [npm install]
17: 0x10abf52 v8::internal::LookupIterator::PrepareTransitionToDataProperty(v8::internal::Handle<v8::internal::JSReceiver>, v8::internal::Handle<v8::internal::Object>, v8::internal::PropertyAttributes, v8::internal::StoreOrigin) [npm install]
18: 0x10cf3da v8::internal::Object::AddDataProperty(v8::internal::LookupIterator*, v8::internal::Handle<v8::internal::Object>, v8::internal::PropertyAttributes, v8::Maybe<v8::internal::ShouldThrow>, v8::internal::StoreOrigin) [npm install]
19: 0x120860f v8::internal::Runtime_StoreDataPropertyInLiteral(int, unsigned long*, v8::internal::Isolate*) [npm install]
20: 0x15f2099  [npm install]
Aborted (core dumped)
[rocky@ik1-443-53839 app]$ free
               total        used        free      shared  buff/cache   available
Mem:          468352       84176      311032        5696       73144      366360
Swap:              0           0           0
[rocky@ik1-443-53839 app]$ free -m
               total        used        free      shared  buff/cache   available
Mem:             457          86         299           5          71         353
Swap:              0           0           0

これ容量たぶんたりないやつーーー(泣)

node_modules重すぎやろ。どうすればええねん。

たぶんdevのやつも全部installしようとしていたから、それを除いてinstallしてみる

$ rm -rf node_modules
$ npm cache clean --force
$ npm install --production

だめだ、なんかうまくいかん。ためしにlocalの容量を調べてみると。

$ du -h
796M    .

796Mか〜〜。そりゃぁたらんなぁ。だって僕の環境0.5Gだもの。 えーーー、あげるーー? ....あげるか。 お金かかるよ〜〜。。

結局上げました。 1GBにして、再度npm install --productionしたら無事でけた。

けど、まだサーバー間通信はうまくいかない。 試しにlocalでbuildして送ってみる。

すると、、うまくいった!正確にはうまくいっていないんだけど、ページ自体は表示された。 だけどaxiosで到達していない。こいつはもしかしてグローバルipアドレスだと思っている?ローカルipアドレスが?

うーーん、調べるか。

調べていったらわかったーーー

なるほどな、nginxのリバースプロキシを使うのか。

Q. リバースプロキシってなに? A. リバースプロキシ (Reverse Proxy) とは、Webサーバーとして動作し、クライアントからのリクエストを受け取り、対象のサーバーに転送する役割を持つサーバーのことを指します。リバースプロキシサーバーは、その機能により、次のような利点を持っています。 ロードバランシング リバースプロキシサーバーは、バックエンドサーバーの負荷を分散するために、リクエストを複数のサーバーに振り分けることができます。これにより、トラフィックの過負荷を回避し、ユーザーエクスペリエンスを向上させることができます。 キャッシング リバースプロキシサーバーは、一度クライアントからリクエストを受け取ったコンテンツをキャッシュすることができます。これにより、バックエンドサーバーへの負荷を軽減し、ユーザーにより高速なコンテンツ配信を提供することができます。 セキュリティ リバースプロキシサーバーは、フロントエンドとバックエンドサーバーの間に置かれるため、クライアントからの直接接続を防ぐことができます。これにより、バックエンドサーバーを直接攻撃されるリスクを軽減し、セキュリティを向上させることができます。 URLの書き換え リバースプロキシサーバーは、クライアントがアクセスするURLを変更することができます。例えば、example.com/api にアクセスした場合に、api.example.com にアクセスするように変更することができます。これにより、バックエンドサーバーのURLを隠蔽することができます。 リバースプロキシは、Webアプリケーションの運用において、非常に重要な役割を担っています。特に、アプリケーションのロードバランシングやセキュリティ対策には、欠かせない存在となっています。
引用元:ChatGPT

じゃあ設定していこう。

server {
  listen       80;
  server_name  nabelog-client;
  charset      utf-8;

  root /usr/local/src/app/build;
  index index.html;

  location / {
    try_files $uri /index.html;
  }
# ↓これを追加
  location /api/ {
    proxy_pass http://192.168.1.2:8080/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

これは「/api/が先頭につく要求はhttp://192.168.1.2:8080/にプロキシするよ」っていう意味。

あと、これが悪さしてたから消しとこう。

  "proxy": "http://192.168.1.2:8080", ← 削除

さぁこれで????

サーバー間通信成功証拠写真

きたーーー!!! 長かった、やっと。 いい勉強になりました。

んで、一応backが他の人からアクセスされないようにネットワークとの接続を切っておこう。

$ sudo nmcli connection down 'System ens3'
client_loop: send disconnect: Broken pipe

あ、、、www そりゃそうか。インターネット経由でサーバーにsshアクセスしてるんだからそうなる。

んーけどなんかens3の接続切ったらローカル通信も切れるっぽい。 CORS設定もしてるし、一旦放置。

dbとbackの接続

次はdbとbackの接続です。 これはどうなんだろ、buildファイルと繋がるのはmysqlを直接参照するし、そんなに問題なさげ。 まずbackサーバーからdbサーバーにプライベートネットワークでmysql接続できるか試してみる。

$ mysql -u server -h 192.168.1.3 -p
-bash: mysql: command not found

うわ、だる。。うーーーん。。mysqlをinstallするとそれだけ容量減るからやだな。。

とりあえずできている前提でつぎやろうか。もしできなかったらやむなくinstallしよう。

ということで早速buildファイルの向き先をプライベートipアドレスに変えてやってみる。

# Clientからの呼び出し元URL
CLIENT_URL="http://192.168.1.1"

MYSQL_DATABASE=DB名
MYSQL_USER=ユーザー名
MYSQL_PASSWORD=パスワード
MYSQL_ROOT_PASSWORD=パスワード
MYSQL_HOST=192.168.1.3

じゃあsystemctlで再起動してみよう。

,,,動かない。。 やっぱりダメかぁ。。じゃあbackサーバーにmysqlを入れよう。

けどこれ思った。clientからアクセスを確認しても実質同じじゃね? ということで容量があるclientからやろう。

$ sudo dnf install mysql-server
43M
・
・
success

$ sudo systemctl start mysqld.service
$ systemctl status mysqld
● mysqld.service - MySQL 8.0 database server
     Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor preset: disabled)
     Active: active (running) since Sun 2023-03-19 00:35:01 JST; 6s ago

43Mは辛いけど、うごいたっぽい。 じゃあclientからdbに呼び出してみよう。

$ mysql -u server -h 192.168.1.3 -p
Enter password:
ERROR 1045 (28000): Access denied for user 'server'@'192.168.1.1' (using password: YES)

んーーー、なんかアクセス拒否されてるな。dbサーバーから直接mysql潜ってみてみよう。

mysql> SELECT host, user from mysql.user;
+-----------------+------------------+
| host            | user             |
+-----------------+------------------+
| %               | exuser           |
| パブリックip      | server           |
| localhost       | mysql.infoschema |
| localhost       | mysql.session    |
| localhost       | mysql.sys        |
| localhost       | root             |
+-----------------+------------------+
6 rows in set (0.00 sec)

あーーそうだった。アクセス制限してるんだった。 じゃあこのユーザー名:serverのやつのhostを変えよう。

mysql> drop user server@パブリックip;
Query OK, 0 rows affected (0.01 sec)

mysql> create user 'server'@'192.168.1.2' identified by パスワード;
Query OK, 0 rows affected (0.00 sec)

mysql> create user 'client'@'192.168.1.1' identified by パスワード;
Query OK, 0 rows affected (0.01 sec)

これでアクセスできるかな?

$ mysql -u client -h 192.168.1.3 -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 222
Server version: 8.0.30 Source distribution

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

でけたーーー!

じゃあ権限絞って、最後に確認しよう。

mysql> grant all on nabelog_pro.* to server@192.168.1.2

サーバーとdbのプライベートネットワーク化完了

でーーーけた!!! 終わり!!