Nginx双机热备连接平稳需三层协同:客户端到Nginx的长连接(keepalive_timeout/requests配置+HTTP/1.1支持)、Nginx到后端的连接复用(upstream keepalive+健康检查+least_conn算法)、Keepalived无感切换(真实健康检查+一致virtual_router_id+VRRP放行),并确保reload时worker_shutdown_timeout保障旧连接平滑退出。

在 Nginx 双机热备环境中保持连接平稳,关键不是只盯着 VIP 漂移快不快,而是让“连接”本身在主备切换、配置更新、后端波动时都不中断、不重置、不卡顿。这需要三层协同:客户端到 Nginx 的长连接管理、Nginx 到后端的连接复用、以及 Keepalived 主备切换时的业务无感过渡。
客户端到 Nginx 的连接不中断
用户浏览器或 App 发起的请求,如果每次都要新建 TCP 连接,不仅延迟高,还容易在主备切换瞬间因连接重试失败而报错。
- 设置 keepalive_timeout 90(建议 60–120 秒),确保空闲连接能复用足够久,覆盖多数短时切换窗口
- 搭配 keepalive_requests 100,限制单连接最大请求数,防内存泄漏或异常累积
- 避免在 location 中误写
proxy_set_header Connection close;如需透传,应设为proxy_set_header Connection "",让 Nginx 自主管理 keepalive 状态 - 确认客户端支持 HTTP/1.1 或更高版本——现代浏览器、curl、移动端 SDK 默认满足,无需额外改造
Nginx 到后端的连接复用与故障隔离
即使 VIP 没漂,后端服务器临时抖动或下线,也会导致 502/504。连接平稳不只是“不断”,更是“不乱切、不堆积、不卡死”。
- upstream 块中必须加 keepalive 32(数值按并发量调整,常见 16–64),启用连接池复用
- 显式声明 proxy_http_version 1.1,否则默认走 HTTP/1.0,无法复用连接
- 配置主动健康检查:
check interval=3 rise=2 fall=3 timeout=1 type=http,配合后端 /health 接口返回 200 或 503 - 算法选 least_conn 而非 round-robin,尤其适合长连接场景——新请求优先落到当前活跃连接更少的后端,避免某台积压大量慢连接
Keepalived 切换时不丢请求
VIP 漂移本身很快(通常 1–3 秒),但若 Nginx 在备机上没准备好,或主节点“假活”,就会出现短暂服务不可用。
- 健康检查必须真实有效:用
vrrp_script chk_nginx执行curl -I http://127.0.0.1:80 -s -o /dev/null -w "%{http_code}" | grep -q "200",而不是只查 nginx 进程是否存在 - weight 建议设为 -8,确保检测失败时 priority 下降足够多,立刻触发切换
- 主备节点的 virtual_router_id 必须相同,网卡名(如 ens33)严格一致,且防火墙放行 VRRP 协议(IP 协议号 112)
- 主节点宕机前,Nginx worker 进程仍在处理存量请求;备机接管 VIP 后,只要其 Nginx 已就绪(可通过 systemctl is-active nginx 验证),流量就能无缝承接
配置热更新时的连接延续
修改 upstream 或 proxy 参数后 reload,旧连接不能被强杀,这是平稳性的最后一道防线。
- 始终用 kill -HUP $(cat /var/run/nginx.pid) 或 nginx -s reload,而非 restart
- 设置 worker_shutdown_timeout 15s,给旧 worker 足够时间处理完剩余请求,又不至于长期滞留
- reload 前务必执行 nginx -t 校验语法;生产环境建议先在备机验证,再同步主节点
- 监控
nginx -s status输出中的 active connections 数,观察 reload 后是否平滑下降而非归零突变


















