proxy_socket_keepalive 真正生效需同时满足四项配置:upstream 启用 keepalive 连接池、启用 HTTP/1.1、清除 Connection 头、显式开启并调参;还需调优内核 TCP 保活参数,并通过 ss 或抓包验证。

要让 proxy_socket_keepalive 真正生效,不能只写 on,它必须嵌入 Nginx 与 upstream 的连接生命周期中,并依赖内核 TCP 保活行为响应探测。核心是“主动发现失效连接”,而非阻止防火墙断连。
必须同步配置的四项基础项
缺一不可,否则 proxy_socket_keepalive 不起作用:
-
upstream 块启用 keepalive 连接池:例如
keepalive 32;。没有连接复用,保活就无从谈起;数值建议为后端实例数 × 平均并发连接数,常见设为 32–128 -
location 或 server 块启用 HTTP/1.1:加
proxy_http_version 1.1;,确保后端接受持久连接 -
清除 Connection 头:加
proxy_set_header Connection "";,避免 Nginx 自动注入Connection: close导致后端主动断连 -
显式开启并调参:在
location或upstream块中写proxy_socket_keepalive on 240s 10s 3;,不能只写on
针对公网/防火墙链路调优参数
系统默认的 7200 秒空闲才探测,远超多数防火墙(300–600 秒)或云 LB 的超时阈值。必须让探测早于设备切断:
-
idle(首探延迟):设为防火墙超时的 70%~80%,如防火墙是 5 分钟(300 秒),则填
240s;若不确定,可先试300s -
interval(探测间隔):建议 5–15 秒,
10s是多数跨公网场景的平衡点 -
probes(失败重试次数):设为
3即可,既能容忍偶发丢包,又不会等待过久
配套调整系统级 TCP 参数
Nginx 的 proxy_socket_keepalive 依赖内核响应。若 /proc/sys/net/ipv4/tcp_keepalive_time 仍是默认 7200 秒,即使 Nginx 配了 240s,内核也可能不触发探测:
- 执行
sudo sysctl -w net.ipv4.tcp_keepalive_time=300 - 执行
sudo sysctl -w net.ipv4.tcp_keepalive_intvl=10 - 执行
sudo sysctl -w net.ipv4.tcp_keepalive_probes=3 - 写入
/etc/sysctl.conf并运行sudo sysctl -p永久生效
验证是否真正生效
仅靠 nginx -t 成功不代表保活已起效:
- 用
ss -o state established '( dport = :8080 )'查看连接是否带timer:(keepalive,...标记 - 抓包验证:在空闲期观察是否有 TCP ACK 探针发出(目的端口为 upstream 端口)
- 模拟防火墙断连:临时将防火墙空闲超时设为 60 秒,观察 Nginx 是否在 60 秒内清理连接、后续请求是否不再报
Connection reset by peer











