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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 07:36:20