2017-07-29 4 views
0

同様の質問がありましたが、正しく実装できません。複数のノードアプリケーション用に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 errorio.on('connect_error')になります。さらに、上記の設定ファイルの行のコメントを外すと、のエラーがio.on('connect_error')になります。

私はwebsocketを適切に使用しているかどうかはわかりません。また、クライアント側でio.connect('...:port')を呼び出すときにポートを指定しないでくださいが、ポートを指定しないと接続を確立できません。誰かが私の間違いや欠けている設定を指摘できたら、私はそれを感謝します。

+0

はい、NGINXはこれに適したツールです。ポート80に入ってくる複数のリクエストを、パス(各アプリケーションのトップレベルのパスセグメントが異なる)に基づいてサーバー上の別のポートにルーティングするか、着信ホスト名に基づいてルーティングするかを設定できますすべてあなたのNGINXプロキシの同じIPアドレスを指しています)。 socket.io接続の場合は、パスまたはホストを使用することもできますが、クライアントを変更する必要がないため、ホストの設定が簡単になります。 – jfriend00

+0

socket.ioでは、クライアントコードの 'var socket = io()'は、Webページがロードされたホストとポートに接続します。それがあなたがやろうとしていることならば、socket.io接続から完全に離れるようにURLを残してください。socket.ioライブラリは自動的に 'window.location'を見て、そのホスト/ポートに接続します。 – jfriend00

答えて

0

nginxをどのように使用しているかを見て、リバースプロキシ設定の使用をお勧めします。

慣れていない場合は、永続的なリダイレクトに基づいて、ポート443へのリダイレクトを含む例があります。

追加のアプリケーション用に複数のサーバー定義を提供します。

server { 
    listen  80; 
    server_name _; 
    rewrite^https://$host$request_uri? permanent; 
} 
server { 

    listen 443 ssl; 
    ssl on; 
    server_name mydomain.tld www.mydomain.tld; #replace these with your own domain name 


    location/{ 
     proxy_pass http://your.ip.address.here:3000; 
    } 

    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 
     root /usr/share/nginx/html; 
    } 

} 
関連する問題