我正在运行一个带有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/