已經提出了類似的問題,但我無法正確實施它。如何使用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')
時指定端口,但是如果不指定端口,則無法建立連接。如果有人能指出我的錯誤或任何缺失的配置,我將不勝感激。
是的,NGINX是正確的工具。您可以在端口80上配置多個請求,以根據路徑(每個應用程序的不同頂級路徑段)或基於傳入主機名(對每個應用程序使用不同的主機名)路由到服務器上的其他端口都指向您的NGINX代理的相同IP地址)。對於socket.io連接,您也可以使用路徑或主機,但主機配置起來更容易,因爲您不必更改客戶端。 – jfriend00
使用socket.io,客戶端代碼'var socket = io()'將連接回網頁加載的主機和端口(根據定義,它始終是打開的,因爲這是網頁的來源)。如果這就是你想要做的,那麼只需將URL從socket.io連接中完全放到socket.io庫就會自動查看'window.location'並將其連接基於該主機/端口。 – jfriend00