我们有一个nodejs应用程序,该应用程序当前使用socket.io(带有名称空间)。该应用程序用作特定金融市场的仪表板。每个应用实例都订阅特定的市场数据并提供仪表板。最初,我们在服务器上为3个不同市场运行了此应用程序的3个独立实例,所有实例均绑定到用于服务请求的独立端口。
由于我们计划添加更多市场,因此拥有一个反向代理服务器是有意义的,在该服务器中可以使用单个端口(每个市场还有单独的URI)。但是,由于各种原因,设置nginx一直是一场噩梦。
(a)市场的每个应用实例可以处于不同的开发阶段,因此可以具有不同的静态文件。通过nginx管理所有静态文件似乎很痛苦?可以做些什么来让应用程序自行处理静态文件。
(b)socket.io通信失败。我们尝试研究网络通信,并且在尝试连接到socket.io服务器时,似乎不断出现404页面未找到错误。不知道为什么它通过http :: / localhost / server.io /而不是ws://localhost/server.io/连接?有人可以指出一个类似的例子吗?有什么需要照顾的吗?
在我们的案例中,我们一直在尝试在nginx sites-available / default内部进行以下操作
location /app/ {
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;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# kill cache
add_header Last-Modified $date_gmt;
add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
if_modified_since off;
expires off;
etag off;
}
答案 0 :(得分:1)
使用nginx作为反向代理不会给您带来麻烦。关于nginx的伟大之处在于,您可以在同一服务器上具有不同域的多个项目。
以下是nginx具有多个项目的示例:
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://localhost:3000;
#Rember to set the header like this otherwise the socket might not work.
proxy_set_header X-Real-Ip $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
server {
listen 80;
server_name subdomain.yourdomain.com;
location / {
proxy_pass http://localhost:3001;
}
}
我不确定您的套接字为什么会失败。也许错误是您尝试在客户端站点上定义路由。尝试使用像这样的javascript:
var socket = io();
或者如果您的套接字在其他应用程序之一上运行:
var socket = io('http://yourdomain.com');
请记住,您所做的更改应添加到启用了站点的位置,而不是添加到可用站点的位置