node.js - Nodejs集群socket.io nginx配置

标签 node.js sockets nginx websocket socket.io

我正在运行一个带有socket.io 库的nodejs 集群。 我通过 nginx 服务器代理请求。 Websocket 连接在大多数情况下都工作正常,但它不能与 socket.io 中的轮询作为传输协议(protocol)一起使用。

这是伪代码:

if (cluster.isMaster) {
  // Fork workers.
 for (var i = 0; i < numCPUs-1; i++) {
    cluster.fork();
  }
 else{
 var server = http.createServer(function(request, response){
    console.log('Connecting server');
    response.end();
});

server.listen(port);
var socket_io = require('socket.io')(server);
var redis_adapter = require('socket.io-redis');
//config.redis.ip,config.redis.port
socket_io.adapter(redis_adapter({ host: config.redis.ip, port: config.redis.port }));

socket_io.use(function(socket, next){
});


socket_io.on('connection', function (socket) {
};

想知道代码是否有问题。 我们需要使用 sticky-session 。如果是的话,在我的情况下使用它的正确方法是什么。

最佳答案

Websocket 默认情况下是粘性的。

轮询作为传输的问题在于,您的连接请求将发送至worker1,而握手或后续请求可能会发送至其他某个worker..假设worker2。并且这个worker2不会有关于这个与worker1建立的socket连接的信息。

如果你的socket.io服务器是直接部署的,你可以使用sticky-session( http://socket.io/docs/using-multiple-nodes/ )。

但是,如果您的 socket.io 服务器位于代理服务器后面,则粘性 session 可能无法以有效的方式工作,因为粘性服务器根据远程 IP 地址平衡请求。在代理服务器的情况下,所有请求最终都会落在同一个工作人员身上,而其余的工作人员将是理想的选择。

在这种情况下,一种可能的解决方案是在多个端口上启动 socket.io 工作线程,并在 nginx/apache 中进行集群平衡。 如需任何进一步帮助,请联系。

关于node.js - Nodejs集群socket.io nginx配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29472777/

相关文章:

sockets - 我怎样才能让 uWSGI 监听另一台机器?

ruby-on-rails-3 - 在Nginx + Unicorn上加载时出现严重的网关错误(Rails 3应用)

javascript - [NodeJs][Sequelize] ReferenceError : Cannot access 'ModelName' before initialization

javascript - 类型错误 : IPFS is not a constructor

node.js - 如何让多个项目共享 node_modules 目录?

javascript - Promise 未使用 async/await 解决

java - 聊天客户端程序出现问题

c++ - 如何在不需要消息循环的情况下使套接字访问行为为 'asynchronously'?

docker - nginx proxy_pass 导致 404 Not Found 页面

amazon-web-services - AWS elastic beanstalk 使用 nginx 位置将 www 重定向到非 www?