同様の質問がありましたが、正しく実装できません。複数のノードアプリケーション用にsocket.ioとNginXでブロックされたポートを回避するには?
私は同じIPでホストされている異なるポートで動作しているいくつかのノードjsアプリケーションを作成しました。しかし、これらのポートは、大学のゲスト無線LANなどの公衆ネットワーク上でブロックされています。これらのネットワーク上のブロックされたポートを回避するためにNginXを適切に(おそらくWebSocketサポートで)設定できるかどうかは疑問です。具体的には、ポート80(ブロックされていない)を訪問先のlocalhostバックエンドの対応するポートに渡すことができるかどうか疑問に思っています。また、これがこの問題の正しい解決策であるかどうかはわかりません。私に代替案を提案してください。
例として、我々はこれら二つのアプリを持っているサーバー側でいるとします
// In app1.js (server side)
var express = require('express');
var app = express();
const server = app.listen(3000,function(){DoSomething();};
const io = require('socket.io')(server);
io.on('connection',function(socket){DoStuff();};
及び第二のアプリケーション:
// In app2.js (server side)
var express = require('express');
var app = express();
const server = app.listen(3001,function(){DoSomething();};
const io = require('socket.io')(server);
io.on('connection',function(socket){DoStuff();};
とそのクライアント側コード
var socket = io.connect('http://mysite.domain.edu:3000'); // works, but not on public wifi
// var socket = io.connect(); // does not work
// var socket = io.connect('http://mysite.domain.edu'); // does not work
// var socket = io.connect('http://mysite.domain.edu/app1'); // does not work
をし、 2番目のアプリのクライアント側:
var socket = io.connect('http://mysite.domain.edu:3001');
これらのアプリは別々に動作しています。 nginxのは
# In /etc/nginx/conf.d/mysites.conf
# I am not sure about these lines, but they do not have any effect.
# map $http_connection $upgrade_requested {
# default upgrade;
# '' close;
# }
server {
listen 80;
server_name mysite.domain.edu;
root /home/user/mysite;
location/{
index /index.html;
}
# ap1 on port 3000
location /app1 {
rewrite ^/app1//(.*) /$1 break;
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
# I am not sure I need these.
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header X-NginX-Proxy true;
# proxy_redirect off;
}
# app2 on port 3001
location /app2 {
rewrite ^/app2//(.*) /$1 break;
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
# I am not sure I need these.
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header X-NginX-Proxy true;
# proxy_redirect off;
}
}
/etc/nginx/conf.d/mysites.conf
はnginxのための私の唯一の設定ファイルであると、これらのポートに要求を渡します。これらの構成では、ポート3000と3001がブロックされているネットワーク上でxhr poll error
がio.on('connect_error')
になります。さらに、上記の設定ファイルの行のコメントを外すと、のエラーがio.on('connect_error')
になります。
私はwebsocketを適切に使用しているかどうかはわかりません。また、クライアント側でio.connect('...:port')
を呼び出すときにポートを指定しないでくださいが、ポートを指定しないと接続を確立できません。誰かが私の間違いや欠けている設定を指摘できたら、私はそれを感謝します。
はい、NGINXはこれに適したツールです。ポート80に入ってくる複数のリクエストを、パス(各アプリケーションのトップレベルのパスセグメントが異なる)に基づいてサーバー上の別のポートにルーティングするか、着信ホスト名に基づいてルーティングするかを設定できますすべてあなたのNGINXプロキシの同じIPアドレスを指しています)。 socket.io接続の場合は、パスまたはホストを使用することもできますが、クライアントを変更する必要がないため、ホストの設定が簡単になります。 – jfriend00
socket.ioでは、クライアントコードの 'var socket = io()'は、Webページがロードされたホストとポートに接続します。それがあなたがやろうとしていることならば、socket.io接続から完全に離れるようにURLを残してください。socket.ioライブラリは自動的に 'window.location'を見て、そのホスト/ポートに接続します。 – jfriend00