已经提出了类似的问题,但我无法正确实施。
我写了一些在同一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')
时指定端口,但是如果没有指定端口,则无法建立连接。如果有人能指出我的错误或任何遗失的配置,我将不胜感激。
答案 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;
}
}