怎么在 Nginx 配置文件中设置 keepalive 长连接优化后端压力

文章导读
正确配置 Nginx upstream keepalive 可将后端 TIME_WAIT 连接数降低 60% 以上,生产环境推荐 keepalive 值设为 16-64,keepalive_timeout 设为 30-60 秒。
📋 目录
  1. 原因分析
  2. 解决方案
  3. 注意事项
  4. 验证方法
  5. 参考来源
A A

怎么在 Nginx 配置文件中设置 keepalive 长连接优化后端压力

正确配置 Nginx upstream keepalive 可将后端 TIME_WAIT 连接数降低 60% 以上,生产环境推荐 keepalive 值设为 16-64,keepalive_timeout 设为 30-60 秒。

原因分析

Nginx 默认对后端服务器采用短连接模式,每个请求都会新建 TCP 连接,导致频繁三次握手和连接释放。根据 2026 年 4 月 2 日发布的性能优化实战数据,未启用 upstream keepalive 时,后端服务 CPU 消耗集中在 SSL 握手和 TCP 三次握手,客户端并发高时后端会出现大量 TIME_WAIT 连接,网络延迟敏感型接口(如 API 网关)P95 延迟明显抬升。Nginx upstream 模块的 keepalive 指令定义 Nginx 与后端服务器之间保活连接池的最大空闲连接数,但仅对 HTTP/1.1 长连接生效,需配合 proxy_http_version 1.1 和 proxy_set_header Connection '' 使用,否则形同虚设。

解决方案

步骤一:配置 upstream 连接池

在 upstream 块中显式设置 keepalive 参数,数值建议设为单个 worker 进程预期并发后端连接的 1-2 倍。示例配置如下:

upstream backend {\n    server 10.0.1.10:8080;\n    server 10.0.1.11:8080;\n    keepalive 32;\n}

根据 2026 年 3 月 19 日发布的指南,若后端 Tomcat maxConnections=200,则 keepalive 建议设为 120-160(后端单实例能稳定承载的并发连接数 × 0.6~0.8),通常 16-64 为合理范围。

步骤二:配置 location 块 HTTP 协议和头部

在 location 块中必须补齐以下三项配置,否则 Nginx 仍会为每个请求新建后端连接:

怎么在 Nginx 配置文件中设置 keepalive 长连接优化后端压力
location / {\n    proxy_pass http://backend;\n    proxy_http_version 1.1;\n    proxy_set_header Connection '';\n}

根据 2020 年 5 月 13 日官方文档说明,Nginx 默认采用 HTTP/1.0 协议向后端发起请求,1.0 协议不支持 keepalive 长连接,必须显式指明 proxy_http_version 1.1。同时需设置 proxy_set_header Connection '' 清除客户端传来的 Connection:close 头,防止 Nginx 误判。

步骤三:调整 keepalive_requests 和 keepalive_timeout

keepalive_requests 决定单个长连接最多处理多少次请求后强制关闭,默认值为 100。根据 2026 年 4 月 14 日的调优数据:

  • React 应用托管场景:建议设为 2000,覆盖首屏加载 + 后续交互 + 若干轮轮询
  • 轻量级 JSON API 服务:QPS>5000 时可设为 1000-3000
  • 若后端存在偶发延迟或连接不稳定:可降到 200-500 强制轮转

keepalive_timeout 控制空闲连接在 Nginx 连接池中保留时间,生产环境推荐 30-60 秒,且必须小于后端服务的 keepalive timeout(如 Nginx 设 60s,后端至少设 75s)。

注意事项

根据多个技术论坛和文档反馈,以下常见误配会导致 keepalive 失效:

  1. 遗漏 proxy_set_header Connection '',导致 Nginx 转发客户端的 Connection:close,后端主动断连(2026 年 3 月 19 日指南明确提及)
  2. 后端服务自身关闭了 keepalive,如 Tomcat 的 connectionTimeout 过短或未启用 keepAlive
  3. 使用了 proxy_buffering off+proxy_cache 组合,某些旧版 Nginx 在缓存未命中时会绕过 keepalive 连接池
  4. 健康检查(health_check)过于频繁且未配置 match 或使用非 HTTP/1.1 请求,意外耗尽空闲连接
  5. 不建议 keepalive_requests 设为 0(不限制),这会掩盖真实连接管理问题,且长期复用可能引发内存缓慢增长(2026 年 4 月 14 日调优建议)

验证方法

优化是否生效需实测验证,不能只看配置文件:

怎么在 Nginx 配置文件中设置 keepalive 长连接优化后端压力
  • 使用 ss -tnp | grep :port | wc -l 观察 Nginx 到后端的 ESTABLISHED 连接数是否稳定在 keepalive 设定值附近(2026 年 4 月 2 日压测要点)
  • 在 Nginx 开启 debug 日志级别,搜索"keepalive""reuse""create"等关键词,确认连接复用行为
  • 观察后端服务器的 TIME_WAIT 连接数是否明显下降,用 ss -s | grep -i time 验证
  • 用 curl -I http://your-site.com/static/main.js 查响应头是否有 Connection:keep-alive

参考来源

来源:Nginx 技术社区 - Nginx 中 keepalive 指令提升负载均衡长连接复用率指南(2026 年 3 月 19 日发布)

来源:性能优化实战 - Nginx 反向代理中的 Keepalive 连接池性能优化实战(2026 年 4 月 2 日发布)

来源:开发者调优手册 - Nginx 中 keepalive_requests 参数对长连接性能的影响调优(2026 年 4 月 14 日发布)

来源:Nginx 官方文档 - upstream_keepalive_module 模块说明(2020 年 5 月 13 日收录)