socket.io 使用 nginx 时客户端无法交互

Client can not interact together when using nginx with socket.io

我有一个使用 socket.io 的聊天应用程序。我将代码放在2台服务器(ip1,ip2)上并使用nginx进行负载平衡。

这是 nginx 配置

upstream socket_nodes {
   ip_hash;
   server ip1:1654;
   server ip2:1653;
}
server {
 listen 1653;
 server_name livechatsoftware.com.vn;    
  location / {
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
  proxy_set_header X-NginX-Proxy true;
  proxy_http_version 1.1;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $host;
  proxy_pass http://socket_nodes;
  proxy_redirect off;
 }
}

如果客户端连接到同一台服务器,则一切正常。但是如果客户端 1 连接到服务器 ip1,客户端 2 连接到服务器 ip2。客户端 1 和客户端 2 无法交互(例如无法发出、发送消息、......)

感谢提前

我正在使用 nginx 对我的节点进程进行负载平衡 (express.js + mongodb + socket.io + passport.js)。虽然它们都在同一台服务器上,但仍然 socket.io 事件不会在它们之间共享。这意味着我也遇到了完全相同的问题。所以我使用 mong.socket.io (https://github.com/tmfkmoney/mong.socket.io) 将 socket.io 事件存储在 mongo 存储中。通过这种方式,每个 socket.io 进程都从集中式存储中读取事件。

您还需要一个可以从任何服务器访问 socket.io 事件的中央存储。我从未使用过那种设置,但请查看以下包;

https://www.npmjs.com/package/socket.io-redis

我会在我的一台服务器上安装 redis,并将我的 socket.io 进程指向该服务器,如下所示;

io.adapter(redis({ host: 'localhost', port: 6379 })); // you should use ip address and the port for the remote server 

您还可以使用我之前分享过的其他适配器选项 link。