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。
我有一个使用 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。