WebSocket连接异常:部分连接自动断开返回1005错误码求助
解决WebSocket 1005错误连接断开问题
针对你遇到的单个WebSocket连接触发1005错误断开的情况,结合你的Nginx配置和服务端环境,给出以下解决步骤:
1. 调整Nginx长连接超时配置
你的Nginx配置中缺少WebSocket长连接的超时设置,默认proxy_read_timeout为60秒,若连接长时间无数据传输,Nginx会主动断开TCP连接,触发1005错误。在location /块中添加超时配置:
location / { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP 192.210.203.237; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 添加长连接超时配置,根据业务需求调整时长,示例为1天 proxy_read_timeout 86400s; proxy_send_timeout 86400s; }
修改后重启Nginx生效:nginx -s reload
2. 完善服务端WebSocket心跳机制
虽然你代码中有pingInterval,但需要确保心跳逻辑正确执行,避免因无数据传输触发Nginx断开。优化心跳代码:
// 30秒发送一次ping帧 const pingInterval = setInterval(() => { if (conn.readyState === WebSocket.OPEN) { conn.ping(); } else { clearInterval(pingInterval); } }, 30000); // 监听pong响应,确认连接存活 conn.on('pong', () => { // 可记录日志或更新连接状态 }); conn.on('close', (e) => { logger.warn('trigger close event', e); closeConn(doc, conn); clearInterval(pingInterval); });
心跳间隔建议短于Nginx的proxy_read_timeout,确保连接始终有数据交互。
3. 排查异常连接的客户端环境
仅单个连接出现问题,需排查该客户端的特殊情况:
- 客户端网络是否存在不稳定、防火墙拦截TCP连接的情况
- 客户端浏览器/SDK的WebSocket实现是否存在兼容性问题(比如旧版本浏览器的WebSocket限制)
- 客户端是否有进程被意外终止的情况
4. 升级WebSocket库版本
你使用的ws@6.2.1版本较旧,存在一些已知的兼容性和稳定性问题。升级到最新稳定版(如ws@8.x),修复旧版本的bug:
npm install ws@latest
注意:升级后需检查API兼容性,ws@8.x部分方法和事件有调整,比如部分错误处理逻辑有变化。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

