跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何配置 proxy_socket_keepalive 开启内核级 TCP 保活机制保障连接

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

相关文章