Nginx不主动发起WebSocket心跳,但需协同配置proxy_read_timeout和proxy_send_timeout(建议设为心跳间隔的2–3倍)、透传Upgrade/Connection头、关闭proxy_buffering与proxy_cache,并确保后端真实发送ping/pong帧。

Nginx 本身不主动发起 WebSocket 心跳检测,但可通过配置超时参数间接控制连接的“心跳窗口”,防止中间网络设备(如防火墙、负载均衡器)因长连接空闲而断连。关键在于合理设置与 WebSocket 生命周期相关的三个超时时间:读写超时、代理超时和升级协商时限。
1. 设置 proxy_read_timeout 和 proxy_send_timeout
这两个指令决定 Nginx 与后端 WebSocket 服务之间数据传输的最大空闲时间。若后端在该时间内未发送任何数据(包括心跳帧),Nginx 会关闭连接。
- proxy_read_timeout:控制 Nginx 等待后端响应(如心跳 pong 帧)的最长时间,默认 60 秒
- proxy_send_timeout:控制 Nginx 向后端发送数据后等待确认的最长时间,通常设为相同值
建议值:根据业务心跳间隔设定,一般设为心跳周期的 2–3 倍。例如后端每 30 秒发一次 ping,可设为 90:
proxy_read_timeout 90; proxy_send_timeout 90;
2. 确保 WebSocket 升级头正确透传
Nginx 必须保留客户端发起的 Upgrade 请求头,并显式启用 WebSocket 支持,否则连接无法完成协议升级,后续心跳自然失效。
- 必须包含 Upgrade 和 Connection: upgrade 头
- 需关闭缓存(
proxy_cache off)和缓冲(proxy_buffering off)
典型配置片段:
location /ws/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_cache off;
proxy_buffering off;
proxy_read_timeout 90;
proxy_send_timeout 90;
}
3. 配合后端心跳策略协同工作
Nginx 不生成或响应 ping/pong 帧,它只转发。因此真正的心跳行为由前后端共同决定:
- 客户端应定期发送
ping,后端及时回复pong - 后端需在
proxy_read_timeout内至少发送一次数据(哪怕只是 pong) - 若后端使用 Netty/Spring WebFlux 等框架,需检查其 WebSocketHandler 是否启用了自动心跳
例如 Spring Boot 中可通过 WebSocketHandler#afterConnectionEstablished 启动定时任务推送 ping,或启用内置心跳(如 Tomcat 的 maxIdleTime)。
4. 可选:调整 keepalive 连接复用参数
虽然 WebSocket 是长连接,但 Nginx 与后端之间的 upstream 连接若被复用,keepalive 设置会影响底层 TCP 连接稳定性:
- proxy_http_version 1.1 已隐含启用 HTTP/1.1 keepalive
- 可在 upstream 块中加
keepalive 32;控制空闲连接池大小 - 配合
keepalive_timeout 60s;避免上游连接过早释放
注意:此设置不影响 WebSocket 数据流本身,但能减少频繁建连带来的抖动,间接提升心跳链路稳定性。


















