はじめに
これにいろいろ機能をつけてきた。 さぁ次はサーバー間通信かな。
localでのサーバー間通信はやってきたけど、本番環境でのサーバー間通信はやったことがない。 ワクワク。やっていこ!
前提イメージ
- さくらVPSにサーバー間通信の機能があるっぽいけど、どうなんだろ。
- なるべく「これ便利サービス」は使いたくない。
- もしできなそうであればネットワークを構築する必要がありそうなので頑張るわ。
調査
→ これでやるっぽい。こんな簡単にできるのか?
→ manualはこれ。やってみるか。
→ やり始めまで参考
→ いまはようわからんけど、あとあと参考になりそう
→ 参考になりそう
→ クソ参考になりそう
→ まんまやん
検索方法はこれ [さくらVPS ローカル接続]
実装
他の人のサイトを見ながらやってみよう。
スイッチの作成
とりあえず作ってみた。
サーバー間通信を行うための、サーバー3つ(front, back, db)をシャットダウンする。
各サーバーに接続先スイッチを追加
サーバーの設定画面 > ネットワーク > ネットワークインターフェース から接続先を設定。
eth0は基本的にインターネットに接続するみたい。だからeth1をさっきのスイッチに設定。
だけどあとでbackサーバーとdbサーバーはeth0のインターネット接続を外す、必要ないしね。
各サーバーのネットワーク設定
んで、いろいろみていたら、どうやらこの後はnmcli
コマンドというものを使うっぽい。
そして、どうやらこっから先のさくらVPS関連の設定はなさげ?
ということは [ nmcli サーバー間通信 ]とかで調べたら出てきそう。
調べてみたけど、やっぱりさくらVPSありきの設定ではありそう。local通信を行うために今回スイッチ作ったしね。
これらを参考にやってみる
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
いいねーー。ちゃんと自身と設定したサーバーには繋がって、それ以外には繋がらないっぽい。
サーバー同士の接続アドレス変更
じゃああとは、アドレスの向き先を変えればいいんかな?
- backとclientの接続
- 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
でーーーけた!!! 終わり!!