You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 19:34:56