Nginx反向代理中长连接最大请求数分两个独立维度:客户端到Nginx的keepalive_requests(配在http/server块,默认100,推荐1000–10000)和Nginx到upstream的keepalive_requests(配在upstream块,默认100,推荐2000–10000),二者作用对象、位置、默认值均不同,须分别配置且协同调优。

Nginx 反向代理中,长连接最大请求数其实分两个独立维度:客户端到 Nginx 的最大请求数,和Nginx 到 upstream 后端的最大请求数。两者必须分别配置,且作用对象、生效位置、默认值都不同。
客户端到 Nginx 的最大请求数(keepalive_requests)
这个参数控制一个 TCP 连接上最多能处理多少次 HTTP 请求,之后 Nginx 会主动关闭该连接(即使还未超时)。
-
配置位置:
http块或server块 -
指令名:
keepalive_requests - 默认值:100
- 推荐值:1000 ~ 10000(高 QPS 场景建议 ≥5000)
例如:
http {
keepalive_timeout 60s;
keepalive_requests 5000; # 每个 client 连接最多服务 5000 次请求
}⚠️ 注意:只调大 keepalive_timeout 而忽略此值,会导致连接频繁被“计数耗尽”而断开,出现大量 TIME_WAIT,尤其在压测或移动端长连接场景下非常明显。
Nginx 到 upstream 后端的最大请求数(upstream keepalive_requests)
这是 Nginx 1.15.3+ 版本新增的指令,用于控制每个 keepalive 空闲连接最多复用多少次请求(即单条后端连接的生命周期上限)。
-
配置位置:
upstream块内 -
指令名:
keepalive_requests(注意:与上面同名但作用域完全不同) - 默认值:100(非常保守,容易成为瓶颈)
- 推荐值:2000 ~ 10000
例如:
upstream backend {
server 192.168.1.10:8080;
keepalive 32; # 每 worker 缓存 32 条空闲连接
keepalive_requests 5000; # 每条空闲连接最多转发 5000 次请求
}✅ 必须配合以下 location 配置才生效:
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}为什么两个 keepalive_requests 都要调大?
- 客户端侧太小 → 连接反复新建,客户端侧 TIME_WAIT 暴涨,TLS 握手开销高
- upstream 侧太小 → Nginx 不断从连接池取出连接又马上释放,无法真正复用,后端看到的仍是高频建连
- 两者不一致没关系,但 upstream 侧通常应 ≥ 客户端侧,因为一个 client 连接可能对应多个后端请求(如微服务聚合)
不复杂但容易忽略


















