proxy_socket_keepalive用于探测并清理被防火墙静默切断的upstream连接,解决“连接已死但Nginx仍在使用”问题;需配合HTTP/1.1、清空Connection头及upstream keepalive连接池共同生效。

proxy_socket_keepalive 不是用来“回收”连接的,而是让 Nginx 主动探测并清理那些已被物理防火墙静默切断、但自身尚未察觉的 upstream 连接。它解决的是“连接已死,Nginx 还在用”的问题,不是主动释放空闲连接。
它针对什么场景
企业级防火墙、云负载均衡器(SLB)、NAT 网关等中间设备,常设置 300~600 秒的 TCP 空闲超时。超时后它们直接丢弃连接,不发 FIN/RST。Nginx 的 socket 仍处于 ESTABLISHED 状态,后续请求发过去就报 Connection reset by peer 或导致 502/504,表现为偶发性错误。
- 只作用于 Nginx → upstream 链路,不影响客户端到 Nginx 的连接
- 不替代应用层心跳,也不防客户端侧断连
- 必须配合 HTTP/1.1 长连接机制才能生效
基础配置要配齐
单独写 proxy_socket_keepalive on 是无效的。必须和以下三项同时启用:
-
proxy_http_version 1.1:启用 HTTP/1.1 协议,支持复用连接 -
proxy_set_header Connection "":清空 Connection 头,避免后端误关连接 -
proxy_socket_keepalive on:开启内核级 TCP keepalive 探测
示例片段:
location /api {proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_socket_keepalive on;
}
参数要按防火墙超时调小
Linux 默认的 TCP keepalive(空闲 2 小时才探测)完全跟不上防火墙节奏。必须显式设为略小于防火墙阈值,比如防火墙是 5 分钟,就设成 4 分钟启动探测:
proxy_socket_keepalive on 240s 10s 3- 含义:空闲 240 秒后开始探,每 10 秒一次,连续 3 次无响应即关闭 socket
- 这样能在防火墙切断前就发现异常,避免请求落到坏连接上
实际部署前,建议通过抓包或查防火墙文档确认其空闲超时值,再把 idle 时间设为其 70%~80%。
还得配上 upstream keepalive 连接池
proxy_socket_keepalive 只负责“判断单个 socket 是否还活着”,真正复用连接、减少新建开销,得靠 upstream 的连接池:
- 在 upstream 块中加
keepalive 32;(数字表示最大空闲连接数) - 同时确保后端服务也支持 HTTP/1.1 keep-alive
- 否则 Nginx 每次都建新连接,keepalive 探测就失去意义
完整 upstream 示例:
upstream backend {server 10.0.1.10:8080;
keepalive 32;
}
location /api {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_socket_keepalive on 240s 10s 3;
}











