keepalive_timeout 控制 HTTP/1.1 长连接空闲超时时间,超时后 Nginx 主动发送 FIN 关闭连接;首参数(如 65s)为实际断连阈值,次参数为响应头提示值;不适用于 HTTP/2,需配合 keepalive_requests、reset_timedout_connection 等协同优化。

Nginx 通过 keepalive_timeout 指令控制长连接的空闲超时时间,超时后主动关闭客户端空闲连接,释放资源。这不是“回收”连接本身(Nginx 不复用 TCP 连接),而是及时断开无数据交互的连接,避免连接堆积、端口耗尽或服务端连接数过载。
keepalive_timeout 的作用机制
该指令定义了 Nginx 与客户端建立的 HTTP keep-alive 连接在无任何请求/响应数据传输时的最大等待时间。一旦连接空闲超过该阈值,Nginx 会在下一次检测到空闲状态时发送 FIN 包关闭连接。
- 仅适用于启用了 HTTP/1.1 keep-alive 的连接(默认开启)
- 不作用于 HTTP/2 连接(其连接生命周期由
http_v2_idle_timeout控制) - 超时判断基于内核 socket 的空闲时间(如
SO_KEEPALIVE或 Nginx 自身定时器),非应用层心跳 - 若连接在超时前收到新请求,计时器重置
典型配置与行为示例
在 http 或 server 块中设置:
其中第一个值(65s)是发送完响应后保持连接打开的时长;第二个值(60s)是发送 Keep-Alive: timeout=60 响应头给客户端的提示值(可选,现代浏览器通常忽略)。实际断连以第一个值为准。
- 客户端发起请求 → Nginx 处理并返回响应,Connection: keep-alive
- 之后 65 秒内无新请求 → Nginx 关闭该 socket
- 若第 60 秒时客户端发来新请求 → 计时器清零,重新开始计 65 秒
配合其他参数优化连接管理
单靠 keepalive_timeout 不足以应对高并发空闲连接场景,需协同配置:
-
keepalive_requests 100;:限制单个 keep-alive 连接最多处理的请求数,防止单连接长期占用(尤其对慢客户端) -
reset_timedout_connection on;:对已超时但未正常关闭的连接(如客户端崩溃未发 FIN),立即重置(RST),更快释放资源 -
client_header_timeout 60s;和client_body_timeout 60s;:分别控制请求头/体读取阶段的超时,防止半开连接阻塞
验证与排查要点
可通过以下方式确认空闲连接是否按预期关闭:
- 使用
ss -tn state established | grep :80观察连接数随时间下降 - 抓包(tcpdump)查看 FIN 包是否在设定 timeout 后发出
- Nginx 日志中不会直接记录“因 keepalive 超时断连”,但可结合
$connection_requests和连接持续时间分析 - 注意:Linux 内核的
net.ipv4.tcp_fin_timeout等参数影响连接完全消失的时间,但不影响 Nginx 主动断连时机











