やったこと
現在の構成
nginx(80portを使用) → node(websocket 3000portを使用 A,B,C...それぞれの部屋に入室可能)
↑の構成からこのように構成を変更してくれと要望があったので実装してみました。
nginx(80portを使用) → node(websocket 3000portを使用 Aの部屋へ)
nginx(80portを使用) → node(websocket 3001portを使用 Bの部屋へ)
nginx(80portを使用) → node(websocket 3002portを使用 Cの部屋へ)
nginx(80portを使用) → node(websocket 3003portを使用 Dの部屋へ)
// それぞれの部屋へのアクセスは{url}?table=Aなどで選択できる(例: localhost:8080?table=A)
やり方
今回はdockerを使用しています。nginxのコンテナとnodeのコンテナが存在します。
nodeコンテナ
部屋作成のロジックはwebsocketの方になるので今回は触らないです。
pm2 の設定
// ecosystem.congig.js
module.exports = [{
script: 'App.mjs',
name: 'App',
exec_mode: 'fork',
instances: 3 // 起動するアプリインスタンス数
}]
exec_modeをforkに設定します。instancesを起動させたい部屋の数に設定します。
nodeの設定
// App.mjs (port番号を指定しているところ)
const port = 3000 + parseInt(process.env.NODE_APP_INSTANCE || 0);
↑を記述。
nginxコンテナ
# default.conf
upstream websocketA {
server game:3000;
}
upstream websocketB {
server game:3001;
}
upstream websocketC {
server game:3002;
}
server {
listen 80; #ポート番号
server_name table.jp;
location / {
proxy_read_timeout 600s;
proxy_send_timeout 600s;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
if ($args ~ "table=A") {
proxy_pass http://websocketA;
}
if ($args ~ "table=B") {
proxy_pass http://websocketB;
}
if ($args ~ "table=C") {
proxy_pass http://websocketC;
}
}
nginxでif文が使えるみたいので↑のように記述してみた。location直下でないとエラーになるので注意。
コメント