Nginx Server 配置中优化连接池如何写

作者:袖梨 2026-08-15

要让Nginx真正复用后端连接,必须同时配置upstream的keepalive、location中proxy_http_version 1.1和proxy_set_header Connection "",以及keepalive_requests和keepalive_timeout参数,并验证ESTAB连接数稳定。

要让 Nginx Server 真正复用与后端的连接,不能只在 upstream 里写 keepalive 32,必须同步配齐协议、头部和连接池三要素。否则连接仍是短连,QPS 上升时后端 TIME_WAIT 暴涨、延迟升高。

upstream 块中声明 keepalive

该指令只能出现在 upstream 块内,且必须在 http 块下定义:

  1. keepalive N 表示每个 worker 进程最多为这台后端缓存 N 个空闲长连接;若有 4 个 worker 和 2 台后端,理论最大空闲连接数是 4 × 2 × N
  2. N 值建议按后端单实例稳定并发数 × 0.6~0.8 计算:Tomcat maxConnections=200 → 设 keepalive 120;Node.js 轻量服务可从 3264 起步
  3. 不要写成全局值,它不是总连接数,而是每个 worker 对每台后端的独立连接池上限

location 中强制启用 HTTP/1.1 并清空 Connection 头

这两项必须同时存在,缺一不可:

  1. proxy_http_version 1.1; —— 否则 Nginx 默认用 HTTP/1.0 向后端发请求,不支持复用
  2. proxy_set_header Connection ""; —— 注意是空字符串,不是 "keep-alive",防止客户端传来的 Connection: close 被透传导致连接中断
  3. 别手动加 Keep-Alive 头,Nginx 会根据连接池状态自动处理

控制单连接生命周期

仅管数量不够,还要管“一条连接能活多久、干多少事”:

  1. keepalive_requests 500; —— 单个空闲连接最多转发 500 次请求后关闭,防后端状态泄漏;API 场景推荐 500~2000
  2. keepalive_timeout 20s; —— 空闲连接在池中最多保留 20 秒;应比后端空闲超时(如 Tomcat 的 connectionTimeout)小 5~10 秒,避免持有已失效连接
  3. 这两个参数从 Nginx 1.15.3+ 才对 upstream 生效,老版本无效

验证是否真正生效

配置完必须实测,不能只看语法是否通过:

  1. 执行 ss -tnp | grep :8080 | grep ESTAB | wc -l(替换为你的后端端口),观察连接数是否稳定在预期附近,而非持续增长或剧烈抖动
  2. 压测对比开启前后:后端 TIME_WAIT 数量、P95 延迟、建连耗时
  3. 用 curl 或浏览器检查后端响应头是否含 Connection: keep-alive;若返回 close 或缺失,说明后端未配合或中间设备(如 WAF)干扰

相关文章

精彩推荐