Keepalived 通过外部脚本检测并重启 Nginx,失败时终止自身以触发 VIP 漂移;脚本需检查存活、尝试启动、验证成功,否则 killall keepalived;配置 vrrp_script 和 track_script 实现权重动态调整与故障转移。

Keepalived 本身不直接管理 Nginx 进程,但它可以通过外部脚本探测 Nginx 状态,并在进程异常时触发重启或故障转移。关键在于把“检测 + 重启 + 失败兜底”逻辑封装进 Shell 脚本,再由 Keepalived 定期调用并根据执行结果动态调整自身权重,从而影响 VIP 漂移行为。
编写可靠的 Nginx 状态检测与重启脚本
脚本需完成三件事:检查 Nginx 是否存活、尝试启动、验证启动是否成功,失败则终止 Keepalived 以触发主备切换。
- 脚本路径建议统一放在 /etc/keepalived/check_nginx.sh,内容如下:
# !/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ]; then
/usr/local/nginx/sbin/nginx
sleep 3
if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
killall keepalived
fi
fi
- 注意 Nginx 启动命令路径要与实际安装路径一致(如使用 yum/apt 安装,可能是 /usr/sbin/nginx)
- 赋予可执行权限:chmod +x /etc/keepalived/check_nginx.sh
在 keepalived.conf 中定义 vrrp_script
Keepalived 需知道何时、如何运行该脚本,并根据结果影响自身行为。
- 在 global_defs 块之后添加:
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight 10
}
- interval 2 表示每 2 秒执行一次检测
- weight 10 表示脚本返回 0(成功)时,当前节点 VRRP 实例优先级 +10;若脚本失败(返回非 0),默认按 weight 负值处理(也可显式写 weight -10)
在 vrrp_instance 中启用脚本追踪
仅定义脚本还不够,必须将其绑定到具体实例,才能真正生效。
- 在 vrrp_instance VI_1 块内添加:
track_script {
check_nginx
}
- 这行表示该实例将周期性运行 check_nginx 脚本,并依据其 weight 规则动态调整 priority
- 当主节点 Nginx 崩溃 → 脚本重启失败 → killall keepalived → 主节点 Keepalived 退出 → VIP 自动漂移到备用节点
验证与注意事项
配置完成后需重启服务并模拟故障验证流程是否闭环。
- 重启 Keepalived:systemctl restart keepalived
- 手动停止 Nginx:killall nginx,观察日志(/var/log/messages)是否出现重启动作或 keepalived 被杀记录
- 确认 VIP 是否在 1–2 秒内迁移到备机(ip addr show 查看)
- 注意:脚本中 sleep 时间不宜过短(至少 2–3 秒),避免因 Nginx 加载配置慢导致误判;也不宜过长,影响故障响应速度


















