Nginx长连接复用需客户端发送Connection: keep-alive头,服务端通过keepalive_timeout等参数控制空闲超时,反向代理场景还需upstream显式配置keepalive及proxy_http_version 1.1。

Nginx 对 Keepalive 长连接的复用管理,核心在于控制客户端连接在响应结束后是否保持打开、能被后续请求复用,以及服务端如何安全回收空闲连接。它不是“自动复用”所有连接,而是通过明确配置决定何时启用、维持多久、最多复用几次。
客户端长连接开启依赖双方协商
Keepalive 复用的前提是客户端(如浏览器、curl)主动发送 Connection: keep-alive 请求头,并且未关闭 TCP 连接。Nginx 默认不会强制开启长连接——它只响应客户端的意愿。若客户端发的是 Connection: close,Nginx 就会在响应后立即断开。
- 现代 HTTP/1.1 客户端默认带
keep-alive,但某些工具或旧客户端可能不发 - 可通过
curl -H "Connection: keep-alive" http://example.com显式测试 - Nginx 不会主动插入
Connection: keep-alive响应头,仅当请求含该头且满足复用条件时才返回
服务端需显式启用 upstream keepalive(反向代理场景)
当 Nginx 作为反向代理(即 upstream 后端有真实应用服务器)时,它与后端之间的连接默认是“每次请求新建 + 立即关闭”的。要复用到后端的连接,必须在 upstream 块中显式配置:
-
keepalive 32;:声明每个 worker 进程最多缓存 32 个空闲到同一后端的连接 -
keepalive_timeout 60s;:空闲连接在连接池中保留最长 60 秒(超出则关闭) -
keepalive_requests 100;:单个 keepalive 连接最多承载 100 次请求(防资源耗尽) - 同时,
proxy_http_version 1.1;和proxy_set_header Connection '';是必需的,用于清除客户端传来的 Connection 头,避免干扰后端
客户端连接的空闲超时由 keepalive_timeout 控制
Nginx 主动管理与客户端之间长连接的生命周期,关键参数是 keepalive_timeout(可在 http/server/location 级别设置):
- 例如
keepalive_timeout 75s;表示:响应完成后,若客户端在 75 秒内没发新请求,Nginx 主动关闭该 TCP 连接 - 第二个可选参数如
keepalive_timeout 75s 60s;中的 60s 是发送给客户端的Keep-Alive: timeout=60响应头,提示客户端“建议你 60 秒后别再用这连接了”——这是提示,非强制 - 过短(如 5s)会导致频繁建连;过长(如 300s)可能积压大量空闲连接,消耗 fd 资源
连接复用受请求方法和协议版本影响
并非所有请求都能复用长连接。Nginx 内部有判断逻辑:
- HTTP/1.0 请求默认不启用 keepalive,除非显式带
Connection: keep-alive - HEAD、GET、OPTIONS 等幂等请求更易复用;POST/PUT 若含大 body 或分块传输,Nginx 可能因缓冲/流式处理限制而跳过复用
- 如果响应中含
Connection: close或Content-Length不明确(如使用 chunked 编码但未正确结束),Nginx 也可能放弃复用
Keepalive 复用不是黑盒机制,它依赖客户端行为、Nginx 配置协同、后端支持三者配合。调优时应结合监控(如 netstat -an | grep :80 | grep ESTABLISHED | wc -l 观察连接数,或用 stub_status 模块看 active connections)来验证效果。

















