2017-07-29 71 views
0

已經提出了類似的問題,但我無法正確實施它。如何使用socket.io和NginX爲多個節點應用程序解決阻塞的端口?

我寫了幾個節點js應用程序,運行在同一個IP上的不同端口上運行。然而,這些端口在一些公共網絡(如大學客人wifi等)上被阻塞。我想知道是否可以正確設置Nginx(可能有websocket支持)以避開這些網絡上的阻塞端口。具體來說,我想知道我是否可以將端口80(未被阻止)的訪問傳遞到本地主機後端的相應端口。此外,我不確定這是否是適合此問題的正確解決方案。請隨時向我建議替代方案。

作爲示例,在服務器端假設我們有這兩種應用:

// 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 

和第二個應用的客戶端:

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被阻塞的網絡中,我從io.on('connect_error')獲得xhr poll error。另外,如果取消註釋上述配置文件中的行,我會從io.on('connect_error')得到timeout錯誤。

我不確定我是否正確使用websocket。另外我想我不應該在客戶端調用io.connect('...:port')時指定端口,但是如果不指定端口,則無法建立連接。如果有人能指出我的錯誤或任何缺失的配置,我將不勝感激。

+0

是的,NGINX是正確的工具。您可以在端口80上配置多個請求,以根據路徑(每個應用程序的不同頂級路徑段)或基於傳入主機名(對每個應用程序使用不同的主機名)路由到服務器上的其他端口都指向您的NGINX代理的相同IP地址)。對於socket.io連接,您也可以使用路徑或主機,但主機配置起來更容易,因爲您不必更改客戶端。 – jfriend00

+0

使用socket.io,客戶端代碼'var socket = io()'將連接回網頁加載的主機和端口(根據定義,它始終是打開的,因爲這是網頁的來源)。如果這就是你想要做的,那麼只需將URL從socket.io連接中完全放到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; 
    } 

} 
相關問題