WebSocket 常见问题怎么排查?连接失败/消息丢失/频繁断开
WebSocket连接问题主要集中在四个环节:建立、握手、传输、稳定性。连接无法建立时,先确认服务器是否启动、端口是否正确、防火墙是否放行,再检查协议——本地开发用ws,生产环境必须wss,部分反向代理默认不转发WebSocket升级请求,需显式配置。握手失败通常是服务端校验不通过:Origin白名单未放行、子协议不匹配、认证信息缺失。消息丢失多因连接已断开但客户端未感知,或发送队列溢出被丢弃。连接频繁断开要排查心跳是否缺失、Nginx代理超时配置、网络中间件是否主动杀长连接。调试时重点监听onerror和onclose事件,通过close code定位原因(1006异常关闭、1008策略违规等),浏览器DevTools的Network面板可查看完整帧数据。
追问
ws和wss混用会导致什么问题?
浏览器强制HTTPS页面只能发起wss连接,ws会被直接拦截。即使服务端支持ws,混用也会触发安全策略报错。开发环境可用ws,上线必须切wss并配置SSL证书。
Nginx反向代理WebSocket需要什么额外配置?
必须加Upgrade和Connection头:
nginxlocation /ws { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 3600s; }
proxy_read_timeout默认60秒,超过不活动就断开,需按业务调大。
如何检测连接是否还活着?
实现心跳机制:客户端定时发ping帧,服务端回pong。若连续N次未收到响应则判定断连,主动重连。不要依赖TCP的keepalive,那个超时太长(默认2小时),不实用。
close code各代表什么?
1000正常关闭,1001端点离开,1006异常关闭(未收到关闭帧,通常是网络断开),1008策略违规,1011服务端异常。1006最常见,说明连接不是正常关闭的,要排查网络和中间件。
消息发送队列溢出怎么处理?
发送前判断readyState是否为OPEN,非OPEN状态入队缓存,连接恢复后补发。设队列上限,超出则丢弃旧消息或拒绝新消息,避免内存撑爆。关键业务消息要做服务端ACK确认,不能发完就当成功。