nginx通过keepalive_requests和keepalive_timeout控制客户端长连接生命周期:前者限制单连接最大请求数(默认100),后者设定空闲超时时间(如60s),需配合proxy_http_version 1.1、proxy_set_header connection ''等配置协同生效。

直接在 http、server 或 location 块中配置 keepalive_requests 和 keepalive_timeout 即可控制客户端长连接的最大复用请求数与空闲超时时间。这两个参数共同决定一条 TCP 连接的生命周期:一个管“最多处理多少次请求”,另一个管“空闲多久就断开”。
设置单连接最大请求数(keepalive_requests)
该指令限制同一个客户端长连接上最多能处理多少个 HTTP 请求,达到后 Nginx 主动发 Connection: close 关闭连接。
- 只能放在
http、server或location块中,不能用于upstream - 默认值是 100,对高 QPS 场景偏保守;公网 API 建议设为 100–500,内部服务可更高
- 设太小(如 1)会退化为短连接,增加三次握手和 TIME_WAIT 压力
- 配合
proxy_set_header Connection ''使用,避免客户端传来的Connection: close干扰复用
设置空闲超时时间(keepalive_timeout)
它定义客户端连接在无新请求到达时,保持打开状态的最长时间。注意:这是“空闲等待时长”,不是总存活时间。
- 语法:
keepalive_timeout timeout [header_timeout],第二个参数可选,用于响应头中的Keep-Alive: timeout=... - 静态资源建议 10–30 秒,常规 Web 页面 45–60 秒,移动端 API 15–30 秒,SSE 等长连场景可设 60–300 秒
- 设太短(≤5 秒)会导致翻页、加载 JS 后发请求前就被断开;设太长(≥300 秒)易堆积僵尸连接,耗尽文件描述符
- 推荐将
header_timeout设为略小于第一个参数,例如keepalive_timeout 60 55
必须同步启用的关键配套项
单独调大这两个参数效果有限,需与以下配置协同生效:
-
proxy_http_version 1.1:确保代理到后端也走 HTTP/1.1,否则前端复用收益被后端频繁建连抵消 -
proxy_set_header Connection '':清空客户端传来的 Connection 头,防止误传close导致上游提前断连 - 若用反向代理,还需在
upstream块中配keepalive N和keepalive_requests M(注意:此keepalive_requests是针对后端连接的,与客户端侧无关)
验证是否生效
配置重载后,可用 curl 检查响应头:
-
curl -I https://your-domain.com/应看到Connection: keep-alive和Keep-Alive: timeout=55(取决于你设的 header_timeout) - 用
netstat -an | grep :443 | grep ESTABLISHED | wc -l观察连接数波动趋势,从“短连风暴”转向稳定复用即表示生效











