keepalive_timeout控制客户端与Nginx间长连接的空闲超时时间,每次收到请求重置计时器,仅影响客户端连接;配合keepalive_requests可更精细管理连接复用与资源释放。

Nginx 的 keepalive_timeout 指令用于控制客户端与 Nginx 之间 HTTP 长连接(Keep-Alive)的最大空闲时间,超时后连接会被主动关闭。它不决定连接能持续多久,而是决定“空闲多久就断开”,对性能和资源占用影响显著。
keepalive_timeout 的作用机制
当客户端发起请求并带上 Connection: keep-alive 头时,Nginx 默认会复用 TCP 连接处理后续请求。但若连接在指定时间内没有新请求到达,Nginx 就会发送 FIN 包关闭该连接。
- 该超时仅针对“无数据传输”的空闲状态,不计算请求处理耗时
- 每次收到有效请求都会重置计时器,不是从首次建立开始累计
- 只影响 Nginx 与客户端之间的连接,不影响 Nginx 到上游服务器的连接
常见配置方式与建议值
语法为 keepalive_timeout timeout [header_timeout];,其中第二个参数可选,用于设置响应头 Keep-Alive: timeout=... 的值(部分老客户端会读取这个值)。
- 默认值通常是
75s,适合大多数 Web 场景 - 高并发静态资源服务可设为
10–30s,加快连接回收 - 移动端或弱网环境可适当延长至
60–120s,减少重连开销 - 设为
0表示禁用长连接(即始终返回Connection: close)
配合 keepalive_requests 使用更合理
单靠超时控制不够精细,建议搭配 keepalive_requests(单个连接最多处理请求数)一起使用:
- 例如
keepalive_timeout 30s;和keepalive_requests 100; - 这样既限制了空闲时间,也防止单连接长期占用、累积请求导致内存增长
- 尤其在存在大文件下载或流式响应时,
keepalive_requests能避免连接被异常“锁死”
注意与 upstream keepalive 的区别
keepalive_timeout 是面向客户端的,而 upstream 块中的 keepalive 指令(如 keepalive 32;)是管理 Nginx 与后端(如 FastCGI、proxy)之间的连接池。两者独立配置、互不影响。
- 前端长连接活跃 ≠ 后端连接也被复用
- 需单独配置
proxy_http_version 1.1;和proxy_set_header Connection "";才能让 proxy 复用后端连接 - 忽略这点容易误判“长连接没生效”,实际是上下游未协同










