阿里云slb需配置tcp监听、关闭http健康检查、放行私网ip及调大空闲超时(如3600秒)才能稳定支持websocket;http监听会终止upgrade握手,http健康检查会误判宕机,安全组与slb白名单须双向配置。

阿里云SLB默认不透传WebSocket连接,直接配HTTP监听基本必断——根本原因不是代码写错,而是SLB没开启协议升级支持或健康检查干扰了长连接。
SLB必须用TCP监听而非HTTP监听
HTTP监听会解析并终止HTTP请求,无法维持WebSocket的Upgrade握手后的长连接;TCP监听才真正透传原始字节流,让后端服务自己处理协议升级。
- 创建SLB实例时,监听协议选
TCP,端口填你后端WebSocket服务实际监听的端口(如18789) - 不要选
HTTP或HTTPS监听,哪怕你前端走的是wss://,后端也必须用TCP透传 - 如果已建好HTTP监听,删掉重来,SLB不支持监听类型热切换
健康检查必须关掉HTTP模式,改用TCP探测
HTTP健康检查会周期性发GET / 请求,而WebSocket服务通常不响应任意HTTP路径,导致SLB误判后端宕机,主动摘除节点。
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
- 在SLB监听配置页,找到“健康检查”设置
- 将健康检查协议从
HTTP改为TCP - 健康检查端口保持与监听端口一致(如
18789),SLB只检测端口是否可连通,不发任何应用层数据 - 超时时间建议设为
5秒,间隔10秒,避免高频探测冲击连接
后端ECS安全组和SLB白名单要双向放行
SLB和ECS之间是独立网络路径,SLB的健康检查、真实流量都来自SLB的私网IP段,不是客户端IP。
- ECS安全组入方向:放行SLB所在VPC的私网网段(如
172.16.0.0/12),端口为你的WebSocket端口(如18789) - SLB白名单(访问控制):若开启,需把你的客户端公网IP或所在IP段加入,否则连接被拒绝
- 别只改ECS防火墙而忽略SLB访问控制策略,这是新手最常漏的一步
空闲超时必须调大,否则60秒就断
阿里云SLB TCP监听默认空闲超时是60秒,WebSocket无心跳就会被强制断连,前端看到的就是 WebSocket is closed before the connection is established 或直接闪退。
- 在SLB监听高级配置中,找到“连接空闲超时时间”,改为
3600(1小时)或更长 - 同时确认后端服务(如OpenClaw)自身也配置了心跳,例如每45秒发一次
pulse帧,避免SLB单方面断连 - 注意:这个值不能无限大,SLB最大支持86400秒(24小时),但业务侧应自行管理连接生命周期
真正卡住人的从来不是WebSocket怎么写,而是SLB那一层看不见的协议终止和超时策略。调完这四点,再配合 netstat -ano | findstr :18789 在ECS上确认连接持续存在,基本就能稳住。










