nginx高可用主备切换失败需按心跳通信、健康检查、vip绑定、日志交叉比对四步排查:先确认vrrp多播连通性,再验证健康脚本真实触发降权,接着检查vip是否正确漂移并排除脑裂,最后结合keepalived、nginx、客户端日志定位断点。

排查 Nginx 高可用双机主备切换失败,关键不是看“切没切”,而是查“为什么没切”——通常卡在心跳不通、健康检查失效、VIP 绑定异常或脑裂误判四个环节。下面按实际排查顺序分步说明。
检查 Keepalived 心跳通信是否正常
VRRP 心跳是主备协商的基础,断了就无法感知对方状态:
- 确认主备节点使用同一网段、同一 virtual_router_id,且防火墙放行 VRRP 协议(协议号 112,多播地址 224.0.0.18);
- 在备节点执行 tcpdump -i eth0 vrrp,观察是否收到主节点发来的 VRRP Advertisement 包;
- 若无包,检查是否禁用了多播(如云服务器默认关闭)、网卡启用了 networkmanager 或 cloud-init 干扰;
- 优先启用独立心跳线(如直连网线配专用子网),避开业务网络单点故障影响。
验证 Nginx 健康检查脚本是否真正生效
仅靠系统进程存活(如 ps 检查 nginx)不够,必须覆盖服务假死场景:
- 手动触发假死:修改主节点 nginx.conf,让 /healthz 接口返回 503 或 proxy_pass 指向一个已关机的后端;
- 立刻执行 /etc/keepalived/chk_nginx.sh(或你定义的检测脚本),确认返回非零退出码;
- 查看 keepalived 日志:tail -f /var/log/messages | grep -i "chk_nginx\|priority",确认是否触发 weight 变化(如 priority -30);
- 常见错误:脚本中用 curl 但未加 --connect-timeout 3,导致超时阻塞;或未加 -f 参数忽略 HTTP 状态码,把 503 当作成功。
确认 VIP 是否能正确绑定与漂移
VIP 不出现,等于切换没发生。需逐节点验证绑定能力:
- 在主节点执行 ip a | grep "192.168.1.100",确认 VIP 出现在 eth0 或对应网卡;
- 停掉主节点 nginx 后,立即在备节点运行相同命令,等待 3–5 秒,观察 VIP 是否出现;
- 若不出现,检查 keepalived.conf 中 virtual_ipaddress 是否写错掩码(如写成 192.168.1.100 而非 192.168.1.100/24);
- 若 VIP 出现在两台机器上,就是脑裂——立刻检查 authentication 密码是否一致、vrrp_garp_master_delay 是否过短、是否有网络分区。
交叉比对三类日志定位真实断点
单看一类日志容易误判,必须三者印证:
- Keepalived 日志(/var/log/messages):搜索 “MASTER”, “BACKUP”, “FAULT”, “Starting Health Check” —— 看状态变迁是否完整;
- Nginx access.log:主节点最后一条记录时间戳,与备节点第一条记录时间戳差值应 ≤1 秒;若中间断 10 秒,说明切换延迟或失败;
- 客户端实测输出:用 watch -n 0.2 'curl -sI http://VIP 2>/dev/null | head -1',观察是否连续出现 Connection refused 或 timeout 超过 2 次;
- 特别注意:若 curl 返回 200 但内容为空或报错页,很可能是备节点 Nginx 配置未同步、静态资源目录缺失或 upstream 指向错误。











