nginx负载均衡连接保持与优雅重连需协同配置客户端到nginx和nginx到后端两层:前者通过keepalive_timeout(60–120s)、keepalive_requests(如100)管理长连接;后者须在upstream中设keepalive n、proxy_http_version 1.1及proxy_set_header connection ""实现连接复用,并配合健康检查、least_conn算法与平滑重载保障故障恢复。

处理 Nginx 负载均衡下的连接保持与优雅重连,核心是分清两个层面:一是客户端到 Nginx 的长连接管理,二是 Nginx 到后端的连接复用与故障恢复。两者需协同配置,不能只调一端。
客户端到 Nginx 的连接保持
这是用户感知最直接的一环。若每次请求都新建 TCP 连接,延迟高、服务器压力大。
- 启用 keepalive_timeout,建议设为 60–120 秒。过短无法复用,过长易积压空闲连接
- 配合 keepalive_requests(如 100),限制单个连接最大请求数,防内存泄漏或超时累积
- 确保客户端也支持 HTTP/1.1 或 HTTP/2,并主动复用连接;浏览器、curl、gRPC 客户端默认行为通常满足
- 避免在
location块中意外覆盖 connection 头,尤其注意proxy_set_header Connection ""是为了清除上游干扰,不是关闭 keepalive
Nginx 到后端的长连接复用
这是提升后端吞吐和稳定性的关键。Nginx 不是简单转发,而是维护一个连接池,复用已建好的 TCP 连接。
- 在
upstream块中添加 keepalive N(如keepalive 32),表示每个 worker 进程最多缓存 N 个空闲长连接 - 必须显式设置 proxy_http_version 1.1,否则默认用 HTTP/1.0,不支持 keepalive
- 用 proxy_set_header Connection "" 清除客户端传来的 connection 头,防止干扰后端判断
- 后端服务(如 Spring Boot、Tomcat)的
connectionTimeout应略大于 Nginx 的proxy_read_timeout,避免 Nginx 还在等响应,后端却已断连
故障时的优雅重连机制
后端临时不可用或主动下线时,Nginx 需快速摘流、平滑切换,而非让用户直面 502/504。
- 配置主动健康检查:
check interval=3s rise=2 fall=3 timeout=1s type=http,并让后端 /health 接口在下线前返回 503 - 设置 max_fails=1 fail_timeout=10s,确保一次失败就标记节点为 down,10 秒内不发新请求
- 搭配 least_conn 算法,比轮询更适应长连接场景——新请求优先落到当前活跃连接更少的后端,避免某台堆积大量长连接
- 若使用 weight 控制流量,下线前可先将目标节点
weight=0,再 reload 配置(或用 Lua 动态更新),实现秒级摘流
重载配置时的连接不中断保障
修改 upstream 或 proxy 参数后热更新,旧连接不能被强杀。
- 用
kill -HUP $(cat /var/run/nginx.pid)或nginx -s reload触发平滑重载 - 旧 worker 进程会进入 graceful shutdown 状态:不再 accept 新连接,但继续处理已有请求直到完成或超时
- 设置 worker_shutdown_timeout 30s(单位秒),防止旧进程滞留太久;值应 ≥ 最长业务响应时间
- 配合 proxy_ignore_client_abort on,避免用户关页面导致 Nginx 中断后端仍在处理的请求











