我在使用 socket.io 版本 3 时遇到了一个奇怪的问题。我试图transports:["websocket"]
只使用它来避免轮询。我当前的设置是一个 EC2 实例作为我的服务器,NGINX 具有这些设置:
location / {
proxy_pass http://localhost:5030;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'Upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
和:
worker_rlimit_nofile 40000;
events {
worker_connections 20000;
# multi_accept on;
}
我的服务器在集群模式下使用 PM2 运行,我使用 Redis 适配器如下:
var socketIo = require("socket.io");
var redisAdapter = require("socket.io-redis");
io.attach(this.server, {
transports: ["websocket"],
});
io.adapter(redisAdapter(process.env.REDISCLOUD_URL));
我的客户端也使用相同版本的 socket.io 并且只有 websockets。几天后一切正常,但使用 3-4 天后,由于传输关闭原因,套接字将不再连接。一开始我以为是我的 Redis DB 满了,但事实并非如此,它甚至还没有满。重新启动服务器后,它再次工作。我认为这是某种缺失的设置,但我找不到。我的 pingTimeout 是 5000,而 pingInterval 是 25000。