关键在于HTTP层健康检查与动态权重降级:用curl检测/health接口状态,失败时通过vrrp_script weight参数降权触发VIP切换,并设nopreempt防抢回,配合免费ARP和云平台适配确保平滑接管。

要让 Nginx 在 Keepalived 环境下实现集群状态的自动化切换,关键不是只配 VIP 漂移,而是让切换真正响应“服务是否可用”——Nginx 进程在、端口通、但返回 502 或超时,这种状态必须被识别并触发切换。
健康检查必须穿透到 HTTP 层
仅靠 ps -C nginx 或 killall -0 nginx 不够可靠。进程存在不代表服务可响应请求。推荐用 curl -f -I http://127.0.0.1:80/health(或 /status),配合 Nginx 的 stub_status 或自定义健康接口。失败时返回非零退出码,Keepalived 才能准确判定异常。
- 确保后端服务(如 upstream)也配置了
max_fails=3 fail_timeout=30s,避免单点抖动误判 - 健康接口建议返回 200 + 简单文本(如 "ok"),不依赖数据库或外部依赖
- 脚本中加
timeout 3防止 curl 卡住阻塞检测周期
Keepalived 主备权重需动态调整
静态 priority 容易导致脑裂或切换滞后。应通过 vrrp_script 的 weight 参数实现动态降权:主节点检测失败时优先级立即下调(如 -10~-20),使其低于备节点当前值,强制触发 VIP 迁移。
- 主节点 priority 设为 100,备节点设为 99(而非 90 以下),留出足够调节空间
-
fall 3 rise 2表示连续 3 次失败才判定故障,连续 2 次成功恢复,避免瞬时抖动误切 - 务必设置
nopreempt(非抢占模式),防止主节点恢复后自动抢回 VIP 导致连接中断
VIP 漂移必须与网络环境对齐
VIP 能否顺利迁移,取决于底层网络是否支持免费 ARP 和组播通信。常见问题包括防火墙拦截 VRRP 协议(协议号 112)、网卡未启用混杂模式、云平台限制广播/组播。
- 检查
interface名称是否正确(ip a确认,不要写错成 ens33/enp0s3 等) - 云服务器(如阿里云、腾讯云)需使用“高可用虚拟 IP”或绑定弹性公网 IP,原生 VRRP 可能受限
- 同一局域网内
virtual_router_id必须全局唯一且主备一致,否则实例无法形成 VRRP 组
切换验证不能只看 IP 是否漂移
真实可用性要看客户端是否无感接管。停掉主节点 Nginx 后,应在另一台机器上持续 curl -s -w "%{http_code}\n" -o /dev/null http://VIP,观察是否在 2~5 秒内从 000 或超时变为 200,且中间最多丢 1 次请求。
- 同时执行
ip addr show查看 VIP 是否已出现在备节点网卡上 - 抓包确认免费 ARP 是否发出(
tcpdump -i any host VIP),这是客户端更新 ARP 缓存的关键 - 若使用 HTTPS,还需验证证书链和 SNI 是否正常,避免因 SSL 握手失败导致“VIP 切了但打不开”


















