vip漂移由keepalived基于vrrp协议实现,nginx仅作无状态反向代理;关键配置virtual_router_id、authentication、advert_int、interface必须严格一致,priority决定归属,需配合vrrp_script健康检查及基础环境准备(防火墙、selinux、时间同步等)。

虚 IP(VIP)漂移不是 Nginx 自身实现的,而是由 Keepalived 基于 VRRP 协议控制的。Nginx 在其中只作为无状态反向代理运行,不参与选主或漂移决策。真正决定 VIP 归属的是 Keepalived 的 priority 比较和健康状态反馈。
关键配置项必须严格一致
两台节点的以下参数若不完全相同,VRRP 报文将被丢弃,VIP 无法协商:
- virtual_router_id:取值 0–255,同一局域网内必须唯一且两端一致;
- authentication:auth_type(如 PASS)与 auth_pass(密码)必须逐字相同;
- advert_int:建议设为 1(心跳间隔 1 秒),这是实现秒级响应的基础;
- interface:绑定的物理网卡名(如 ens160、eth0)需真实存在,且命名尽量统一。
priority 决定 VIP 归属,state 仅是初始标识
不要依赖 state MASTER/BACKUP 锁定角色——它只是启动时的初始状态。实际 VIP 绑定取决于 priority 数值大小:
- 主节点 priority 设为 101,备节点设为 99(差值 ≥2 更稳妥);
- 两台都配 state BACKUP 是更安全的做法,可降低脑裂风险;
- 若希望主恢复后自动抢回 VIP,需在 vrrp_instance 外显式添加 nopreempt;若不写,默认启用抢占。
必须配合健康检查脚本,避免“假活”
Keepalived 默认只检测进程存活或端口可达,无法感知 Nginx 内部异常(如 worker 崩溃但 master 仍在)。因此要引入自定义检查:
- 编写 nginx_check.sh 脚本,执行
curl -f http://127.0.0.1/health或检查 worker 进程数; - 在 keepalived.conf 中通过
vrrp_script定义检查逻辑,并绑定到 vrrp_instance; - 脚本失败时自动降低本机 priority(如减 20),触发 VIP 漂移。
基础环境准备不可跳过
很多 VIP 不漂移的问题根源不在 Keepalived 配置,而在底层环境:
- 关闭防火墙或放行 VRRP 协议(协议号 112)及组播地址 224.0.0.18;
- 禁用 SELinux(setenforce 0 + 修改 /etc/sysconfig/selinux);
- 开启 IP 转发:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf && sysctl -p; - 确保两节点时间同步(chronyd/ntpd),偏差过大会影响健康检查判定。











