Keepalived 通过外部脚本实现服务级健康检查而非进程级监控,需按端口连通性、HTTP响应、进程存活三级校验,返回标准退出码、使用绝对路径、加超时控制,并在配置中联动权重变化触发VIP漂移。

Keepalived 本身不直接监控进程,它靠外部脚本判断服务状态,再通过 VRRP 协议触发 VIP 漂移实现故障转移。关键不是“有没有进程”,而是“服务是否真正可用”。
脚本必须覆盖三层健康维度
单看进程是否存在(如 ps aux | grep nginx)极易误判——进程可能僵死、端口未监听、HTTP 返回 502。生产环境推荐按优先级组合校验:
- 先用
nc -z 127.0.0.1 80或ss -tln | grep ':80$'确认端口可连 - 再用
curl -f -s -o /dev/null -w '%{http_code}' http://127.0.0.1/healthz验证业务响应(建议 Nginx 配置location /healthz { return 200; }) - 最后辅以
kill -0 $(cat /var/run/nginx.pid 2>/dev/null)检查主进程存活且有权限访问
脚本行为要严格符合 Keepalived 要求
- 必须返回标准退出码:
exit 0表示健康,非 0(如exit 1)表示异常 - 所有命令用绝对路径(如
/usr/bin/curl),避免因子进程无$PATH失败 - 加超时控制(如
timeout 3 curl ...),防止卡死阻塞 Keepalived 主循环 - 脚本需
chmod +x,存放路径在两节点保持一致(如/opt/scripts/check_nginx.sh)
Keepalived 配置需精准联动权重变化
在 keepalived.conf 中定义检查逻辑:
vrrp_script chk_nginx {
script "/opt/scripts/check_nginx.sh"
interval 2 # 每2秒执行一次
weight -5 # 每次失败降低优先级5
fall 3 # 连续3次失败才判定为down
rise 2 # 连续2次成功才恢复up
}再在 vrrp_instance 块中引用:
track_script {
chk_nginx
}主节点初始 priority 100,备节点设 95。当主节点连续失败,其有效优先级降至 100 - 5×3 = 85,低于备节点的 95,VRRP 自动触发 MASTER → BACKUP 切换。
避免脑裂与保障切换可靠
- 启用
preempt_delay 30(备节点配置),防止网络抖动引发频繁抢主 - 设置
notify_master /opt/scripts/notify.sh,在角色变更时清理缓存或发告警 - 主备节点 Nginx 配置、静态资源、SSL 证书必须完全同步,否则接管后服务异常
- 切换验证不能只看 VIP 是否漂移,必须
curl -I http://虚拟IP确认业务真实可达
不复杂但容易忽略

















