nodejs cluster socket.io nginx配置

时间:2015-04-06 14:00:02

标签: node.js sockets nginx websocket socket.io

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

这是伪代码:

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。如果是,在我的情况下使用它的正确方法是什么。

1 个答案:

答案 0 :(得分:2)

默认情况下,websockets是粘性的。

轮询作为传输的问题是您的连接请求将转到worker1,而握手或子请求可能会转移给其他worker..lets说worker2。并且此worker2将不具有与worker1建立的此套接字连接的信息。

如果您的socket.io服务器是直接部署,则可以使用粘性会话(http://socket.io/docs/using-multiple-nodes/)。

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

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