Nginx 不实现断线重连状态机,其核心是作为可信管道保障长连接稳定透传。需正确配置协议升级头、超时参数、upstream 连接池、健康检查及禁用缓冲压缩,以避免上下文丢失。

Nginx 本身不实现“断线重连状态机”,也不维护客户端连接的上下文(如 WebSocket 的会话状态、HTTP 流式请求的中间进度等)。它作为七层反向代理,核心职责是透传、路由与连接保活。所谓“保护转发上下文”,本质是通过配置让 Nginx 不破坏、不截断、不误杀已建立的长连接,并为前后端协同容错提供稳定通道。关键不在“Nginx 自动重连”,而在“让重连变得可预期、低损耗、不丢上下文”。
确保协议升级与头部透传准确无误
WebSocket 或 HTTP/2 流式通信依赖 HTTP 协议升级流程,任何头部丢失或误改都会导致 101 升级失败,降级为普通 HTTP,上下文彻底丢失。
- 必须在
location块中显式启用:proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
- 若用于普通 HTTP 长连接(非 WebSocket),则应清空 Connection 头:
proxy_set_header Connection "";
否则客户端传来的
Connection: close可能被透传,触发后端主动断连。
用超时参数对齐业务语义,避免静默中断
Nginx 默认的 proxy_read_timeout 60s 对监控类、IoT 类长连接极不友好。中断常发生在“无数据但心跳正常”的空闲期,此时上下文仍在内存中,却被代理强制关闭。
- 根据后端心跳策略设置超时(建议 ≥2 倍心跳间隔):
proxy_read_timeout 120; # 后端每 60 秒 ping 一次,则设为 120s proxy_send_timeout 120; proxy_connect_timeout 30;
- 同时确保后端服务自身 idle timeout ≥ Nginx 设置值,否则后端先断,Nginx 无法感知,下次复用该连接时直接报
connection refused或reset by peer。
启用 upstream 连接池并严格匹配后端容量
频繁建连不仅开销大,更会导致后端连接数飙升、线程耗尽、响应延迟激增——此时上下文可能因后端 OOM 或拒绝连接而丢失。
- 在
upstream块中启用 keepalive:upstream backend { server 192.168.1.10:8080; server 192.168.1.11:8080; keepalive 32; # 每 worker 缓存最多 32 个空闲连接 keepalive_requests 1000; # 单连接最大请求数(防长连接长期占用) keepalive_timeout 60s; # 空闲连接保留时间 } - 注意:
keepalive必须配合proxy_http_version 1.1和proxy_set_header Connection ""使用,三者缺一不可;否则连接池形同虚设。
配合健康检查与故障转移,缩短不可用窗口
当某后端实例宕机或网络分区,Nginx 若仍持续转发请求,会导致大量连接失败、前端重连风暴、上下文重建成本陡增。
- 启用基础健康探测(开源版需第三方模块,如
nginx_upstream_check_module):upstream backend { check interval=3 rise=2 fall=3 timeout=1; server 192.168.1.10:8080; server 192.168.1.11:8080; } - 并配置失败自动流转:
location /ws/ { proxy_pass http://backend; proxy_next_upstream error timeout http_502 http_503 http_504; proxy_next_upstream_tries 2; proxy_next_upstream_timeout 10s; }这样,单次请求若命中异常节点,Nginx 会在超时或错误后,将同一请求重试到下一个健康节点(仅限幂等方法,如 GET /ws/health),避免前端重复发起重建逻辑。
关闭缓冲与压缩,防止帧边界错乱
WebSocket 是全双工帧协议,gzip 或 proxy_buffering 可能合并、截断或延迟发送二进制帧,造成客户端解析失败、连接异常关闭,看似“断线”,实为数据损坏。
- 显式禁用:
proxy_buffering off; gzip off; # 若必须开启 gzip,请确保不压缩 WebSocket 常见 MIME 类型 # gzip_types text/plain application/json;
- 对于高实时性场景(如音视频信令),还可启用 TCP_NODELAY:
proxy_socket_keepalive on; # 防静默断连 # 注意:tcp_nodelay 是 server/http 级指令,非 proxy 指令
不复杂但容易忽略,Nginx 的角色是“可信管道”,不是“智能中继”。上下文保护的真正主力,始终是前端的重连策略(带退避、带心跳探测)和后端的会话持久化设计(如 Redis 存储连接元信息)。Nginx 所做,只是把这条管道擦得足够亮、修得足够直、堵得足够少。


















