nginx反向代理需显式配置upstream keepalive连接池并配合http/1.1头才能实现后端连接复用;关键配置包括keepalive n、proxy_http_version 1.1、proxy_set_header connection '',且需后端支持keepalive。

在 Nginx 中使用 proxy_pass 进行反向代理时,连接复用(connection reuse)不是默认开启的,但可通过合理配置显著降低后端建连开销、提升吞吐并减少 TIME_WAIT 连接堆积。关键在于启用 HTTP/1.1 的 keepalive 机制,并配合 upstream 的连接池管理。
upstream 中启用 keepalive 连接池
这是实现连接复用的核心步骤。Nginx 不会自动复用与后端的连接,必须显式定义 keepalive 指令:
- 在
upstream块中添加keepalive N;(如keepalive 32;),表示每个 worker 进程最多缓存 N 个空闲长连接 - 该数值不宜过大——一般建议设为后端单实例可承受的并发连接数的 1/4~1/2,避免后端资源耗尽
- 必须搭配
proxy_http_version 1.1;和proxy_set_header Connection '';,否则后端可能关闭连接
客户端到 Nginx 的连接保持
虽然不直接影响 proxy_pass 到后端的复用,但上游连接稳定有助于整体效率:
-
keepalive_timeout 65s;控制客户端空闲连接保持时间 -
keepalive_requests 100;限制单个连接最大请求数,防止单连接长期占用资源 - 若前端有 CDN 或负载均衡器,还需确认其是否透传
Connection: keep-alive头
后端服务的兼容性要求
连接复用能否生效,取决于后端是否支持 HTTP/1.1 keepalive:
- 主流应用服务器(如 Tomcat、Spring Boot 内置 Tomcat、Node.js、Gunicorn)默认支持,但需检查其最大 keepalive 连接数和超时设置
- 例如 Tomcat 的
maxKeepAliveRequests和keepAliveTimeout应 ≥ Nginx 的对应值 - 若后端是 PHP-FPM,它本身不处理 keepalive,实际复用发生在 Nginx 与 PHP-FPM 的 FastCGI 连接层,此时应关注
fastcgi_keep_conn on;
验证连接复用是否生效
可通过以下方式确认配置已起作用:
- 查看 Nginx
stub_status模块输出中的Active connections和Reading/Writing/Waiting状态变化趋势 - 抓包观察 TCP 层:复用场景下,同一 client-ip:port → backend-ip:port 的连接会被多次复用,而非每次新建
- 检查后端 access log 中的
Connection头是否为keep-alive,或日志中连接建立频率明显下降











