Angular+Go项目中WebSocket每7分钟自动断开的原因排查求助
WebSocket每7分钟自动断开排查方案(Angular+Go+AWS ALB+Nginx环境)
针对你遇到的WebSocket每7分钟自动断开问题,结合你的技术栈和环境,重点排查以下几个配置点:
1. 调整AWS ALB目标组的空闲超时
AWS ALB的目标组默认空闲超时为60秒,但可调整至最大4000秒(约66分钟)。你遇到的7分钟(420秒)断开,大概率是ALB未配置足够长的空闲超时。
- 登录AWS控制台,找到对应应用的目标组;
- 修改空闲超时参数为你需要的时长(例如设置为86400秒即1天);
- 确认ALB监听规则中无额外的超时限制。
2. 完善Nginx的WebSocket相关配置
除已设置的proxy_read_timeout和keepalive_timeout,还需补充以下关键配置:
location /ws { proxy_pass http://your_backend_address; proxy_http_version 1.1; # 必须配置WebSocket升级头 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; # 已设置的长超时 proxy_read_timeout 604800s; # 补充发送超时,避免Nginx向后端发数据超时断连 proxy_send_timeout 604800s; keepalive_timeout 604800s; }
修改后重启Nginx生效。
3. 添加TCP层心跳机制
即使上层配置了长超时,中间网络设备(防火墙、路由器)仍可能因连接长时间无数据传输主动断开。需在前后端添加心跳包:
Go后端(Gorilla WebSocket)
在建立连接后配置TCP保活:
conn, err := upgrader.Upgrade(w, r, nil) if err != nil { // 错误处理 return } // 获取底层TCP连接并配置保活 tcpConn, ok := conn.UnderlyingConn().(*net.TCPConn) if ok { tcpConn.SetKeepAlive(true) tcpConn.SetKeepAlivePeriod(30 * time.Second) // 每30秒发送一次保活包 }
Angular前端(RxJS WebSocket)
通过定期发送ping帧维持连接:
import { webSocket, interval } from 'rxjs'; import { tap } from 'rxjs/operators'; const wsSubject = webSocket('wss://your-domain/ws'); // 每30秒发送一次心跳 const heartbeat$ = interval(30000).pipe(tap(() => wsSubject.next({ type: 'ping' }))); // 同时订阅连接和心跳 wsSubject.subscribe(); heartbeat$.subscribe();
4. 排查其他中间组件的超时
若架构中包含WAF、CDN等其他中间件,需检查这些组件的空闲超时设置,它们也可能主动断开长时间空闲的WebSocket连接。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

