keepalived 通过自定义脚本+ vrrp_script 实现 nginx 健康检查与主备自动切换:脚本需用 kill -0、ss/nc、curl 多重校验并返回标准退出码;配置中定义 script 路径、间隔、权重及 track_script;需设超时、notify、preempt_delay 并同步配置;验证时须检查 vip 漂移、业务可达性及脚本权限与路径。

Keepalived 本身不直接监控 Nginx 进程,但可通过自定义脚本 + vrrp_script 机制触发健康检查,结合 VRRP 状态切换实现主备节点间自动故障转移。核心在于:脚本准确判断 Nginx 是否可用,Keepalived 根据脚本返回值决定是否降权或切主。
编写可靠的 Nginx 健康检查脚本
脚本需覆盖常见故障场景(进程消失、端口未监听、HTTP 响应异常),并返回标准退出码(0 表示健康,非 0 表示异常):
- 用
kill -0 $(cat /var/run/nginx.pid 2>/dev/null)检查主进程是否存在且有权限访问 - 用
ss -tln | grep -q ':80$'或nc -z 127.0.0.1 80验证监听状态 - 用
curl -f http://127.0.0.1/healthz -o /dev/null -s -w '%{http_code}' | grep -q '200'检查 HTTP 接口(建议在 Nginx 中配置location /healthz { return 200; }) - 脚本末尾统一用
exit $status,避免因中间命令失败但未被捕获导致误判
在 Keepalived 配置中注册并调用脚本
在 /etc/keepalived/keepalived.conf 的全局区域定义脚本路径与执行频率,在实例中引用:
- 添加
vrrp_script chk_nginx { script "/opt/scripts/check_nginx.sh" interval 2 weight -5 },每 2 秒执行一次,失败时降低优先级 5 - 在
vrrp_instance VI_1块中加入track_script { chk_nginx } - 确保主节点初始优先级(如 100)高于备节点(如 90),当主节点脚本连续失败,其优先级低于备节点时自动触发 MASTER → BACKUP 切换
避免脑裂与确保切换可靠性
单靠进程检查易受瞬时抖动影响,需叠加多重防护:
- 设置
script执行超时(如timeout 3),防止脚本卡死阻塞 Keepalived 主循环 - 启用
notify_master /opt/scripts/notify.sh等通知脚本,在角色变更时执行清理或日志记录 - 在备节点上确认
preempt_delay 30,避免网络闪断引发频繁抢主 - 同步两节点的 Nginx 配置与静态资源,确保接管后服务行为一致
验证与排错要点
切换是否生效不能只看 VIP 是否漂移,还需验证业务可达性:
- 手动 kill -9 nginx 主进程,观察
ip addr show中 VIP 是否在备机出现,同时tail -f /var/log/messages | grep Keepalived查看状态日志 - 检查脚本权限:
chmod +x /opt/scripts/check_nginx.sh,且 Keepalived 进程用户(通常 root)能执行该脚本及其中所有命令(如 curl、nc) - 若脚本中含绝对路径命令(如
/usr/bin/curl),确保路径正确;可临时加set -x调试输出 - Keepalived 默认以非交互式方式运行脚本,避免依赖环境变量(如 PATH),建议在脚本开头显式设置
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin











