keepalived 通过自定义脚本配合 vrrp_script 实现 nginx 健康检查与 vip 故障转移,脚本需叠加进程、端口、http 三层校验并正确退出,配置中需定义检查频率、权重及 notify 通知机制,确保切换可靠且业务无感。

Keepalived 本身不直接监控 Nginx 进程,而是通过自定义脚本配合 vrrp_script 机制实现状态感知与自动切换。核心逻辑是:脚本准确判断 Nginx 是否真正可用,Keepalived 根据其退出码(0=健康,非0=异常)动态调整节点优先级,触发 VIP 漂移完成故障转移。
编写健壮的 Nginx 健康检查脚本
单一进程检查极易误判,需叠加三层校验:
-
进程存在性:用
kill -0 $(cat /var/run/nginx.pid 2>/dev/null)验证主进程是否存活且当前用户有权限访问 PID 文件 -
端口监听状态:用
ss -tln | grep -q ':80$'或nc -z 127.0.0.1 80确认 80(或 443)端口确实在监听 -
HTTP 服务可用性:配置 Nginx 的
location /healthz { return 200; },再用curl -f http://127.0.0.1/healthz -o /dev/null -s -w '%{http_code}' | grep -q '200'检查真实响应
脚本末尾统一使用 exit $status,避免中间命令失败未被捕获导致“假阳性”。
在 Keepalived 中注册并联动脚本
脚本路径、频率和权重需在配置中明确定义:
- 在
global_defs或全局区域添加:vrrp_script chk_nginx {<br> script "/opt/scripts/check_nginx.sh"<br> interval 2<br> timeout 3<br> fall 2<br> rise 1<br> weight -5<br>} - 在
vrrp_instance块内引用:track_script { chk_nginx } - 主节点初始
priority设为 100,备节点设为 90;当主节点连续两次失败,优先级降为 90,等于备节点,VRRP 协议会触发 MASTER → BACKUP 切换
防止脑裂与增强可靠性
生产环境必须规避瞬时抖动和网络闪断引发的误切:
- 启用
preempt_delay 30(备节点),让恢复后的主节点延迟 30 秒再尝试抢主,避免频繁震荡 - 在
vrrp_instance中配置notify /opt/scripts/notify.sh,接收$1(master/backup/fault)参数,用于发钉钉、企业微信或写日志 - 确保两节点 Nginx 配置完全一致(含 SSL 证书、静态资源路径、proxy_pass 转发规则),接管后行为零差异
验证切换是否真正生效
不能只看 VIP 是否漂移,要验证业务层连通性:
- 手动执行
kill -9 $(cat /var/run/nginx.pid)模拟故障 - 在备机运行
ip addr show查 VIP 是否已绑定 - 从外部 curl VIP 地址,确认 HTTP 返回正常、页面可加载
- 查看
/var/log/messages中 Keepalived 日志,确认状态变更记录与时间戳
脚本权限(chmod +x)、SELinux 上下文、路径可读性,都是常见失败点,需一并检查。











