Nginx长连接需分客户端到Nginx和Nginx到upstream两个方向独立配置:前者用keepalive_timeout与keepalive_requests控制空闲超时和请求数,后者须在upstream块配keepalive并启用proxy_http_version 1.1及清空Connection头。

Nginx 中配置长连接(Keep-Alive)需区分两个方向:客户端到 Nginx 的连接,以及 Nginx 到后端服务的连接。二者配置位置、指令和作用完全不同,不能混用。
客户端长连接:控制浏览器 → Nginx
这部分由 keepalive_timeout 和 keepalive_requests 控制,放在 http、server 或 location 块中均可(优先级 location > server > http)。
-
keepalive_timeout:设空闲超时时间。例如
keepalive_timeout 30s 30s;表示连接空闲 30 秒即关闭;第二个值会写入响应头Keep-Alive: timeout=30,供部分浏览器参考 -
keepalive_requests:设单连接最大请求数。例如
keepalive_requests 1000;表示该连接处理完第 1000 个请求后立即关闭 - 两者是“双杀机制”——任一条件先满足,连接就断开。不设 keepalive_requests 时默认为 100;keepalive_timeout 默认 75 秒
后端长连接:控制 Nginx → upstream 服务
这部分必须在 upstream 块内配置 keepalive 指令,并搭配 proxy 相关设置,否则无效。
-
keepalive N 只能写在
upstream块里,例如:
upstream backend {<br> server 127.0.0.1:8000;<br> keepalive 32;<br> }
表示每个 worker 进程对这台后端最多缓存 32 个空闲长连接 - 必须在
location中启用 HTTP/1.1 并清空 Connection 头:
proxy_http_version 1.1;<br> proxy_set_header Connection "";
缺一不可。HTTP/1.0 不支持复用,而透传客户端的Connection: close会导致后端直接断连 - 从 Nginx 1.15.3 起,upstream 块内还可加
keepalive_timeout 20s;和keepalive_requests 500;,用于控制空闲连接在池中的存活时间和转发次数(老版本不支持)
常见误区与验证要点
很多人把客户端和后端的 keepalive 配置弄混,或漏掉关键配套项。
- keepalive_timeout 和 keepalive_requests 对 upstream 完全无效——它们只管前端连接
- 把
keepalive 32写在server或location块里会报错:unknown directive "keepalive" - 后端服务自身也要支持长连接(如 Tomcat 的
connectionTimeout、Go 的MaxIdleConns),否则 Nginx 缓存了也没法复用 - 验证是否生效:用
ss -tnp | grep :端口 | grep ESTAB | wc -l查看后端 ESTABLISHED 连接数是否稳定;压测对比 TIME_WAIT 数量和延迟变化



















