怎么在 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 仍会为每个请求新建后端连接:
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 失效:
- 遗漏 proxy_set_header Connection '',导致 Nginx 转发客户端的 Connection:close,后端主动断连(2026 年 3 月 19 日指南明确提及)
- 后端服务自身关闭了 keepalive,如 Tomcat 的 connectionTimeout 过短或未启用 keepAlive
- 使用了 proxy_buffering off+proxy_cache 组合,某些旧版 Nginx 在缓存未命中时会绕过 keepalive 连接池
- 健康检查(health_check)过于频繁且未配置 match 或使用非 HTTP/1.1 请求,意外耗尽空闲连接
- 不建议 keepalive_requests 设为 0(不限制),这会掩盖真实连接管理问题,且长期复用可能引发内存缓慢增长(2026 年 4 月 14 日调优建议)
验证方法
优化是否生效需实测验证,不能只看配置文件:
- 使用 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 日收录)