keepalive_requests用于限制客户端到nginx的长连接最多处理的http请求数,达上限后nginx主动断连;默认100,可设于http/server/location块,不可用于upstream,需配合keepalive_timeout等协同调优。

直接在 http、server 或 location 块中写一行 keepalive_requests 数字; 即可,它限制的是客户端到 Nginx 这一段长连接最多处理多少个 HTTP 请求,达到后 Nginx 主动断连。
配置位置和基本写法
这个指令不能放在 upstream 块里,只作用于 inbound 连接(浏览器 → Nginx):
- 全局默认:写在
http块内,所有 server 继承 - 按域名定制:写在
server块内,覆盖 http 级设置 - 按路径细化:写在
location块内,比如 API 接口单独设低值
示例(server 级):
server {
listen 443 ssl;
server_name api.example.com;
keepalive_timeout 30;
keepalive_requests 2000;
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection '';
}
}
数值怎么选才合理
别照搬默认的 100,要贴合实际请求节奏:
- React/Vue 单页应用首屏+交互+轮询,常见 50–200 次请求 → 起步建议 2000
- 高频心跳或状态轮询接口(每 2–5 秒一次)→ 推荐 1000–3000
- 后台管理类、用户操作间隔长的页面 → 200–500 更稳妥
- 后端不稳定或有内存泄漏风险 → 主动压到 100–300,加快连接轮转
设为 0 表示不限制,不推荐;设为 1 就退化成短连接,失去复用意义。
必须同步配好的配套项
keepalive_requests 单独生效效果有限,这几项得一起调:
-
keepalive_timeout要匹配:建议设为平均请求间隔的 1.5–2 倍,比如 QPS=20(间隔 50ms),timeout 可设 15–25 秒 -
proxy_http_version 1.1和proxy_set_header Connection ''必须开启,否则 upstream 无法复用连接 -
reset_timedout_connection on开启后能强制清理僵死连接,防 fd 和内存滞留 - 前端启用 Gzip/Brotli + 强缓存,减少重复请求数,不然再高的上限也撑不住
怎么确认它真起作用了
不能只看配置文件有没有写,得验证真实行为:
- 用
curl -I http://example.com/连续发请求,观察第 N 次响应头是否从Connection: keep-alive变成Connection: close(N ≈ 你设的值) - 加日志变量:
log_format main '$remote_addr – $request_time $connection_requests';,看 access log 中每连接请求数是否集中在设定值附近截断 - 用
ss -tni | grep :443查看各连接的已传输请求数(需内核支持 tcp_info)











