跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

如何配置 upstream 结合 keepalive 提升反向代理到后端的连接复流效率

提升Nginx反向代理连接复用需三者齐备:upstream中配置keepalive连接池、proxy层启用HTTP/1.1并清除Connection头、后端服务支持长连接;缺一不可。 要提升 Nginx 反向代理到后端的连接复用效率,关键不是“开了 keepalive 就行”,而是 up stream 与 proxy 层协同生效——仅在 u ps tream 块写
keepalive 32
不起作用,必须三者齐备:连接池定义、协议升级、请求头清理。 upstream 块中必须声明 keepalive 连接池 这是复用的物理基础。Nginx 默认对每个请求都新建后端 TCP 连接,不缓存空闲连接。需显式启用连接池: keepalive N :每个 worker 进程最多缓存 N 个空闲长连接(非总连接数)。建议值 = 后端单实例稳定并发数 × 0.6~0.8。例如后端 Tomcat
maxConnections=200
,可设为
120
~
160
keepalive_requests N :单个 keepalive 连接最多承载 N 次请求后主动关闭。默认 100 易导致频繁断连,生产环境推荐
1000
~
10000
(取决于后端稳定性) keepalive_timeout Ns :空闲连接在池中保留时长(秒)。必须小于后端服务的 keepalive timeout(如 Nginx 设 60s,后端至少设 75s),推荐
30s
~
60s
proxy 上下文中强制启用 HTTP/1.1 并清除干扰头 即使 upstream 配了 keepalive,若请求仍走 HTTP/1.0 或携带
Connection: close
,Nginx 会绕过连接池直接建新连接: 稿定在线PS PS软件网页版 下载 proxy_http_version 1.1 :必须显式声明,HTTP/1.0 不支持 keepalive proxy_set_header Connection '' :清空客户端传来的 Connection 头(如
close
),避免误传给后端导致其主动断连 可选但推荐:
proxy_set_header Host $host
和
proxy_set_header X-Real-IP $remote_addr
,保持原始上下文 确保后端服务真正支持并维持长连接 Nginx 的 keepalive 只控制“发出端”,后端才是连接生命周期的最终决定者: 后端响应头中应含
Connection: keep-alive
(HTTP/1.1 默认行为,一般无需手动加) 检查后端配置:Tomcat 的
connectionTimeout
应 ≥ Nginx 的
keepalive_timeout
;Node.js 的
server.keepAliveTimeout
、Go 的
http.Server.IdleTimeout
同理 避免使用禁用 keepalive 的老服务(如某些 IIS 默认配置或旧版 PHP-FPM) 验证是否真正复用而非“纸面配置” 不能只看配置文件,要从连接状态和流量行为确认: 用
ss -tan | grep :后端端口 | grep ESTAB | wc -l
观察连接数是否稳定在
keepalive
设定值附近(如设 32,压测中维持在 25~32) 用
tcpdump -i any port 后端端口 -nn -c 100
抓包,查看是否有大量重复 SYN/SYN-ACK(未复用典型特征) 对比开启前后:TIME_WAIT 数量是否下降、P95 延迟是否降低 10%~40%、TPS 是否提升 20%~100%+

相关文章