核心思路是Nginx主动探测连接状态以提前清理失效连接。需实测防火墙TCP空闲超时值(如30s/60s/120s),在upstream中配置proxy_socket_keepalive on 30s 5s 3,同步启用proxy_http_version 1.1、proxy_set_header Connection ''及upstream keepalive,并调优系统tcp_keepalive_time等参数。

核心思路是让 Nginx 主动探测连接状态,赶在防火墙切断前发现并清理失效连接,而不是被动等待错误发生。
确认防火墙实际空闲超时值
这是所有配置的前提。不能凭经验猜 60s 或 120s,必须实测:
- 联系网络或安全团队获取设备型号和策略文档,查明确切的 TCP 空闲超时(常见为 30s、60s、120s)
- 用 tcpdump 抓包验证:在 Nginx 与 upstream 之间无业务流量时,观察多久后防火墙主动发 FIN 或 RST
- 若无法获取准确值,按最保守的 30s 设计,后续再根据日志和抓包微调
启用并精准配置 proxy_socket_keepalive
它不是“保活”连接,而是让内核在 TCP 层发探测包,及时识别已断链路:
- 必须写在 upstream 块内,例如:
upstream backend {
server 10.0.1.100:8080;
proxy_socket_keepalive on 30s 5s 3;
} - 三个参数含义:空闲 30 秒后开始探、每 5 秒一次、连续 3 次失败即关闭;总探测窗口为 45 秒,略小于 60 秒防火墙超时
- 避免踩坑:interval 不要低于 2s(内核限速),probes 超过 5 意义不大,且会拖长故障感知延迟
同步补齐三项必要配套配置
缺一不可,否则 proxy_socket_keepalive 不生效:
- proxy_http_version 1.1; —— 放在 location 或 server 块中,确保使用 HTTP/1.1 协议
- proxy_set_header Connection ''; —— 清除 Nginx 默认加的 Connection: close,防止后端拒收持久连接
-
upstream 中启用 keepalive 连接池,例如:
upstream backend {
server 10.0.1.100:8080;
keepalive 64;
}
检查并调优系统级 TCP 参数
Nginx 的配置依赖内核行为,若系统默认值过大,仍会失效:
- 检查当前值:
sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_intvl net.ipv4.tcp_keepalive_probes - 若 tcp_keepalive_time 是默认 7200s,需临时调整:
sysctl -w net.ipv4.tcp_keepalive_time=60(建议设为略大于 proxy_socket_keepalive timeout) - 如需永久生效,写入
/etc/sysctl.conf并执行sysctl -p











