Socket.io(v4.6.1)连接5分钟自动断开,如何配置避免异常断开?
解决Socket.io v4.6.1连接5分钟自动断开的问题
调整Socket.io心跳配置
Socket.io依赖心跳机制维持长连接,显式配置心跳参数可避免中间件或默认设置导致的超时断开。在服务器端初始化Socket.io时添加以下配置:
var io = require('socket.io')(http, { pingInterval: 10000, // 每10秒发送一次心跳包 pingTimeout: 50000 // 等待客户端心跳响应的超时时间(50秒) });
更频繁的心跳会让中间件判定连接处于活跃状态,不会主动截断。
禁用HTTP服务器超时
Node.js的http.Server默认存在超时限制,即使Socket.io心跳正常,也可能被HTTP服务器强制断开。在启动服务器前禁用超时:
http.setTimeout(0); // 禁用HTTP层超时 http.listen(port , () => { console.log("HTTP listening on port " + port + "."); });
客户端同步配置
确保客户端的心跳参数与服务器端一致,同时显式启用自动重连(默认已开启,声明后更明确):
const socket = io({ reconnection: true, reconnectionAttempts: Infinity, pingInterval: 10000, pingTimeout: 50000 });
排查反向代理/中间件超时
如果服务部署在Nginx、Apache等反向代理后,这些服务通常有默认超时设置(部分默认值为5分钟)。以Nginx为例,需调整以下参数:
proxy_connect_timeout 600s; proxy_send_timeout 600s; proxy_read_timeout 600s;
将超时时间设置为大于Socket.io心跳间隔+超时的总和,避免代理层提前断开连接。
排查断开原因
在服务器端监听disconnect事件,打印断开原因,定位问题根源:
io.on('connection', (socket) => { socket.on('disconnect', (reason) => { console.log(`连接断开 ${socket.id}: ${reason}`); }); });
常见原因包括ping timeout(心跳未响应)、transport close(传输层关闭)等,可根据输出针对性调整配置。
内容的提问来源于stack exchange,提问作者Antonin Bouhier
相关产品推荐
相关产品推荐

