如何使用socket.io和NginX为多个节点应用程序绕过被阻止的端口?

时间:2017-07-29 02:44:30

标签: node.js nginx websocket socket.io

已经提出了类似的问题,但我无法正确实施。

我写了一些在同一IP上托管的不同端口上运行的节点js应用程序。然而,这些端口在某些公共网络上被阻止,例如大学访客wifi等。我想知道我是否可以正确设置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

和第二个应用程序的客户端:

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')。另外,如果取消注释上述配置文件中的行,我会从timeout收到io.on('connect_error')错误。

我不确定我是否正确使用websocket。另外我想我不应该在客户端调用io.connect('...:port')时指定端口,但是如果没有指定端口,则无法建立连接。如果有人能指出我的错误或任何遗失的配置,我将不胜感激。

1 个答案:

答案 0 :(得分: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;
    }

}