Nginx 中限制 Nginx 到后端单连接最大请求数需依赖后端自身配置(如 Tomcat 的 maxKeepAliveRequests),Nginx 无 upstream 级 keepalive_requests 指令;其 keepalive_requests 仅作用于客户端到 Nginx 链路,上游复用由 upstream keepalive + proxy_http_version 1.1 + proxy_set_header Connection "" 共同实现。

要在 Nginx 反向代理中真正支持后端长连接的 HTTP Keep-Alive 最大请求数,关键不是只配 keepalive_requests,而是让 Nginx 与上游(后端)之间也建立并维持复用连接,并对这条上游连接设置独立的请求数上限——这需要配合 upstream 块中的 keepalive 指令和相关 proxy 设置。
必须启用 upstream 的连接池并配置 keepalive 数量
Nginx 默认与后端是“每请求新建连接”,要复用连接,需在 upstream 块中显式启用连接池:
- 使用
keepalive N;(如keepalive 32;),表示该 upstream 最多缓存 N 个空闲的、已建立的 TCP 连接供复用 - 该指令必须放在
upstream块末尾,且不能与least_conn等负载策略混用(Nginx 1.20+ 支持部分组合,但建议单独测试) - 注意:这里的
keepalive N是连接池大小,不是单连接请求数;它本身不设“单连接最大请求数”,这个上限由后端服务自身控制,Nginx 不干预
通过 proxy_set_header 和协议版本启用长连接通道
仅 upstream 开启连接池还不够,还需确保每次请求都复用已有连接,而不是新建:
- 在
location或server块中设置:proxy_http_version 1.1;(HTTP/1.1 才支持 Keep-Alive) - 清除客户端传来的 Connection 头:
proxy_set_header Connection '';,避免 Nginx 把Connection: close错误透传给后端 - 显式要求后端保持连接:
proxy_set_header Connection 'keep-alive';(可选,多数后端默认支持)
限制 Nginx 到后端的单连接请求数?实际不可控,但可间接影响
Nginx 本身没有类似 keepalive_requests 那样直接限制“到 upstream 单连接请求数”的指令。它的 keepalive_requests 只作用于**客户端到 Nginx 的连接**。
- 如果你希望后端连接也“轮换”,只能靠后端自身配置(如 Tomcat 的
maxKeepAliveRequests、Gunicorn 的--limit-request-line等) - Nginx 能做的间接控制包括:调小
upstream keepalive数量(如设为 4~8),让连接更早被回收重用;或配合proxy_next_upstream error timeout http_502;在异常时主动断连 - 若后端支持 HTTP/2,Nginx 1.19.10+ 可用
http_v2_max_requests控制上游 HTTP/2 连接的最大请求数,但需开启proxy_http_version 2.0;
验证是否生效的实用方法
光看配置不够,得确认连接真正在复用:
- 用
ss -tni | grep :查看 ESTABLISHED 连接数是否稳定在keepalive N设定值附近,而非随请求飙升 - 在 upstream 后端加日志,观察同一 socket fd 是否连续处理多个请求(如 Netty 的
channel.id()或 Go 的conn.RemoteAddr()) - 抓包看 TCP 层:复用连接时,后续请求应无 SYN 包,只有 PSH/ACK 流量


















