keepalived+nginx vip主备漂移的核心是健康检查脚本将nginx服务能力转化为keepalived可识别信号,通过vrrp实现秒级切换;关键在四点:三层次健康检查(进程、端口、http)、weight权重联动降级、防抖与脑裂防护(nopreempt、auth_pass一致、nginx启停交由notify控制)、arp内核调优确保客户端正确寻址。

Keepalived+Nginx 实现 VIP 主备漂移,核心不是让 Keepalived “管” Nginx,而是用健康检查脚本把 Nginx 的真实服务能力翻译成 Keepalived 能识别的信号,再通过 VRRP 协议驱动虚拟 IP 在主备节点间秒级切换。配置关键在脚本逻辑、权重联动、防抖与网络防护四点,缺一不可。
写一个真正可靠的健康检查脚本
不能只查进程是否存在,必须覆盖进程、端口监听、HTTP 服务三层次:
- 用
kill -0 $(cat /var/run/nginx.pid 2>/dev/null)确认 master 进程存活且有权限访问 - 用
ss -tln | grep -q ':80$'或nc -z 127.0.0.1 80验证 80 端口确实在监听 - 用
curl -f http://127.0.0.1/healthz -o /dev/null -s -w '%{http_code}' | grep -q '200'检查业务级响应(需在 Nginx 中配置location /healthz { return 200; }) - 所有环节任一失败,脚本统一返回非 0 状态码;全部通过才返回 0
Keepalived 配置要绑定健康状态与优先级
脚本只是“传感器”,切换由 vrrp_script 的 weight 机制驱动:
- 在全局块定义检查脚本:
vrrp_script chk_nginx {<br> script "/opt/scripts/check_nginx.sh"<br> interval 2<br> timeout 3<br> weight -5<br>} - 在
vrrp_instance VI_nginx块中引用:track_script { chk_nginx } - 主节点设
priority 100,备节点设priority 90;主节点连续两次失败后优先级降为 90,低于备节点,触发自动让位
防止脑裂和频繁切换
VIP 同时出现在两台机器上会引发流量错乱,必须做三层防护:
- 主节点启用
nopreempt,避免恢复后立即抢主造成抖动;如需平滑回归,可配合健康脚本自动恢复权重 - 主备节点
virtual_router_id和auth_pass必须完全一致,否则 VRRP 报文无法互通 - 所有节点禁用
systemctl enable nginx,改由 Keepalived 的notify_master脚本启动 Nginx,notify_backup停止它,杜绝双主风险 - 同步 Nginx 配置、SSL 证书路径、静态资源目录,确保接管后行为完全一致
内核与网络层加固,确保 ARP 正确刷新
VIP 漂移后客户端仍发包到旧机器,往往是 ARP 缓存未更新,需调优内核参数:
- 执行:
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignoreecho 2 > /proc/sys/net/ipv4/conf/all/arp_announce - 将上述两行写入
/etc/sysctl.conf永久生效 - 确认 VIP 与物理 IP 在同一网段;若跨网段或云环境受限制,改用单播通信或对接 SLB











