核心是让Nginx与后端稳定复用TCP连接,需配齐proxy_http_version 1.1、proxy_set_header Connection ''和upstream keepalive三项;配套keepalive_timeout、禁用proxy_buffering,并通过TIME_WAIT下降、debug日志reuse频次及ss端口复用验证效果。

优化 proxy_pass 在高并发下的连接复用率,核心是让 Nginx 与后端服务之间稳定复用 TCP 连接,而不是每次请求都新建连接。这能显著降低建连开销、减少 TIME_WAIT、提升吞吐和稳定性。关键不在客户端怎么连 Nginx,而在 Nginx 怎么高效地“管住”它和后端之间的那批连接。
必须配齐的三项基础配置
缺一不可,否则 upstream keepalive 形同虚设:
-
proxy_http_version 1.1;——放在location或server块内。HTTP/1.0 不支持长连接,不设此项,后端会直接断连。 -
proxy_set_header Connection '';——清空 Connection 请求头。否则 Nginx 可能把客户端发来的Connection: close转发给后端,导致连接被主动关闭。 -
keepalive 32;——写在upstream块中。表示每个 worker 进程最多缓存 32 个空闲到该后端的连接(不是全局总数),建议值为单台后端最大并发连接数的 1/2~1/3,通常设 16–64。
配套调优超时与缓冲行为
光有 keepalive 不够,超时和缓冲策略不匹配,连接照样会被频繁释放或卡死:
- 设置
keepalive_timeout 60s;(写在 upstream 块内),避免空闲连接长期滞留占用资源;该值应略小于后端服务自身的 keepalive timeout(如 Tomcat 的connectionTimeout)。 - 确保后端返回
Connection: keep-alive和合理Keep-Alive: timeout=60, max=1000,否则 Nginx 无法感知可复用性。 - 禁用不必要的缓冲:
proxy_buffering off;(对流式响应或短会话更稳妥),防止响应延迟或粘包干扰复用判断。
验证复用是否真实生效
配置完不能只看 reload 成功,要从系统现象交叉确认:
- 在后端服务器执行
ss -s | grep -i time_wait,复用率提升后,TIME_WAIT 数量应明显下降(理想降幅超 50%)。 - Nginx 开启 debug 日志(
error_log /path/to/error.log debug;),搜索keepalive.*reuse,看到大量 reuse 行为、极少create connection,说明复用已起效。 - 用
ss -t -o src :8080(假设后端监听 8080)观察源端口复用情况:同一本地端口被多个请求复用,而非每次请求都换新端口。
HTTP/2 和 gRPC 场景额外注意
若后端是 HTTP/2 或 gRPC(基于 HTTP/2),需补充控制单连接承载能力:
- 添加
http2_max_requests 1000;(放在 upstream 块中),防止单连接请求过多导致内存膨胀或后端拒绝。 - 确保 Nginx 编译时启用了
--with-http_v2_module,且proxy_http_version显式设为2.0。 - gRPC 客户端需使用支持 HTTP/2 keep-alive 的 SDK(如 Go 的
grpc.WithKeepaliveParams),否则 Nginx 层复用无效。











