Linux Nginx 平滑重载时后端连接池可平稳切换,关键在于启用并合理配置 upstream keepalive、确保 HTTP 协议直连、匹配 location 层协议头控制、验证连接复用及新旧 worker 协同管理。

Linux Nginx 平滑重载时后端连接池能否平稳切换,不取决于“是否重启”,而取决于连接池是否被复用、旧连接是否被保留、新旧 worker 是否协同工作。关键不是新建连接,而是不让已有空闲连接被丢弃或强制关闭。
确认 upstream keepalive 已启用并配置合理
连接池复用的前提是显式开启且参数适配:
- 在 upstream 块中必须写明 keepalive 32(数值建议 16–64),不能省略;仅靠 proxy_http_version 1.1 不足以激活连接池
- 后端地址必须用 HTTP 协议(如 server 10.0.0.20:8080),避免直连 HTTPS,否则绕过 keepalive 池
- keepalive 值不宜过大:超过后端服务最大连接数限制会导致连接拒绝;也不宜过小(如 4),导致复用率低、TIME_WAIT 泛滥
验证连接池是否真正复用而非重建
不能只看 reload 成功,要观测连接生命周期:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 在 access_log 中加入 $upstream_connect_time 和 $upstream_addr,reload 后观察同一客户端的请求是否持续命中相同后端地址,且 connect_time 接近 0(说明复用空闲连接)
- 用 ss -tnp | grep :8080 分别在 reload 前、中、后抓取 ESTABLISHED 连接数——理想状态是旧连接数缓慢下降,新连接数逐步上升,无断崖式归零
- 访问 /nginx_status(需启用 stub_status),关注 Active connections 总数是否平稳,Reading/Writing/Waiting 分布无剧烈抖动
确保新旧 worker 协同管理连接池
平滑的本质是“旧 worker 不退出,新 worker 不抢连”:
- 执行 nginx -s reload 后,用 ps aux | grep nginx 查看进程树:应同时存在旧 worker(PPID 是原 master)和新 worker(PPID 是新 master),共存数秒至数十秒
- 检查 worker_shutdown_timeout 是否设为合理值(如 60s),且大于 proxy_read_timeout;否则旧 worker 可能在长连接未结束前被强制终止,触发 RST
- error.log 中若频繁出现 upstream prematurely closed connection 或 client closed connection while reading response,说明连接被非自然中断,需排查超时设置或后端 draining 行为
location 层协议与头控制必须匹配
即使 upstream 配置正确,代理层协议不一致也会让连接池失效:
- location 中必须设置 proxy_http_version 1.1,HTTP/1.0 不支持 Keep-Alive,Nginx 将拒绝复用连接
- 必须设置 proxy_set_header Connection ""(清空 header),而非 Connection: keep-alive;后者可能干扰后端判断,导致它主动发 close
- 禁止在 location 中写 proxy_set_header Connection "close" 或类似覆盖逻辑,会直接禁用复用

















