nginx Socket.io ,PM2群集处于生产状态- WebSocket与粘性会话

hyrbngr7  于 2023-03-01  发布在  Nginx
关注(0)|答案(1)|浏览(177)

我有点困惑。我socket.io在NodeJS服务器上使用www.example.com,使用了一个简单的:

const server = http.createServer(app);
const io = socketIo();
io.attach(server);
io.adapter(redisAdapter(process.env.REDISCLOUD_URL));
server.listen(3000)

现在我使用PM2集群选项集群了我的服务器进程。
我的nginx配置如下所示:

location / {
                proxy_pass http://localhost:5030;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
        }

我是否还应该添加websocket传输,而不是普通的http轮询?

const server = http.createServer(app);
const io = socketIo();
io.attach(server, {
   transports: [ 'websocket' ]
});
io.adapter(redisAdapter(process.env.REDISCLOUD_URL));
server.listen(3000)

在socket.io网站中,他们建议而不是,他们建议使用nginx.conf文件中的upstream在节点之间平衡负载,并使用粘性会话,如下所示:

upstream nodes {
    # enable sticky session based on IP
    ip_hash;

    server app01:3000;
    server app02:3000;
    server app03:3000;
  }

但是我没有app01app02app03。我有PM2进程,但它们都驻留在同一个localhost:5030地址上。那么,我是否只能选择启用websocket传输,而放弃长轮询的回退选项?

7z5jn7bk

7z5jn7bk1#

upstream nodes {
  hash $remote_addr consistent;
  server yourhost.com:3000;
  server yourhost.com:3001;
  server yourhost.com:3002;
}
location / {
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $host;
  proxy_pass http://nodes;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
}

您需要使用nginx作为负载平衡器,并切换到fork模式,当然,您将使用不同的端口群集模式,我们需要另一种解决方案

相关问题