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