Nginx主备双机热备依赖Keepalived管理VIP实现秒级故障切换,Nginx仅作无状态反向代理;需配置统一健康检查、去状态化参数、标准化日志与status接口,并通过vrrp_script结合进程与HTTP状态探测确保可靠性。

通过 Nginx 实现主备网关双机热备,核心不是靠 Nginx 自身“主备切换”,而是借助外部高可用机制(如 Keepalived)管理虚拟 IP(VIP),让 Nginx 作为无状态反向代理服务运行在两台机器上,由 VIP 统一对外提供服务,故障时自动漂移。Nginx 本身不参与选主逻辑,只专注转发——这才是标准化、可运维的实践方式。
Keepalived + Nginx 构建主备网关架构
这是业界最成熟、轻量且稳定的方案:一台主机(MASTER)持有 VIP 并提供服务;另一台(BACKUP)实时监听 MASTER 状态,一旦检测失败(如 Nginx 进程退出、端口不可达、或网络中断),立即接管 VIP,实现秒级切换。
- Keepalived 负责健康检查与 VIP 漂移,不依赖第三方中间件,部署简单
- Nginx 配置完全一致(除日志路径等本地差异),避免配置漂移风险
- 所有业务流量始终通过 VIP 访问,下游系统无需感知后端节点变化
Nginx 标准化配置要点
两台 Nginx 服务器需保持配置同步,重点在于去状态化和可观测性:
- 禁用 proxy_buffering off 等可能引发连接阻塞的非常规设置,确保请求/响应流式透传
- 统一启用 proxy_next_upstream error timeout http_502 http_503 http_504,配合 upstream 的健康探测提升容错能力
- 日志格式中固定加入 $remote_addr(真实客户端 IP) 和 $upstream_addr(转发目标地址),便于故障定位
- 配置独立的 status 接口(如 location /nginx_status { stub_status on; access_log off; } ),供 Keepalived 健康检查调用
Keepalived 健康检查与优先级控制
仅靠心跳不够,必须结合 Nginx 服务可用性做主动探测:
- 在 vrrp_script 中定义检测脚本,例如:
vrrp_script chk_nginx {
script "/usr/bin/killall -0 nginx && curl -s --head http://127.0.0.1/nginx_status | grep '200 OK' > /dev/null"
interval 2
weight 20
}
确保 Nginx 进程存活且能响应内部状态页 - MASTER 节点 priority 设为 100,BACKUP 设为 90;当 MASTER 的 chk_nginx 失败时,其有效优先级 = 100 − 20 = 80,低于 BACKUP 的 90,触发切换
- 启用 preempt_delay 30,防止网络抖动导致 VIP 频繁来回漂移
验证与日常维护建议
上线前必须完成三类验证,运维中需固化巡检项:
- 手动停掉 MASTER 的 Nginx,确认 VIP 在 3–5 秒内迁移至 BACKUP,且业务请求无连接拒绝(TCP RST)
- 在 BACKUP 上执行 ip a | grep "inet.*virtual",确认 VIP 已绑定;同时检查 Nginx 日志是否持续写入
- 定期检查 /var/log/keepalived.log 中的 transition 日志,以及 Nginx error_log 中的 upstream connect timeout 记录
- 将两节点的 Nginx 配置纳入 Git 版本管理,更新后使用 nginx -t && nginx -s reload 原子生效










