keepalived 通过自定义健康检查脚本 + vrrp_script + notify 实现 nginx 进程监控与报警:脚本需返回 exit code 判定状态,vrrp_script 配置检测间隔、权重调整及故障阈值,并在 vrrp_instance 中引用;notify 脚本响应状态切换,支持邮件、webhook 等告警,调试需验证脚本返回值、日志输出及 vip 漂移。

Keepalived 本身不直接监控 Nginx 进程,但可以通过自定义健康检查脚本 + vrrp_script + notify 配合实现进程状态检测和报警触发。
编写 Nginx 进程检查脚本
在 Keepalived 节点上创建一个可执行脚本(如 /etc/keepalived/check_nginx.sh),用于判断 Nginx 是否存活:
- 常用方式是用
pgrep -x nginx或systemctl is-active nginx | grep -q "active" - 更稳妥的做法是结合进程检查 + 端口探测(如
curl -s http://127.0.0.1:80/healthz -o /dev/null -w "%{http_code}" | grep -q "200") - 脚本需有执行权限:
chmod +x /etc/keepalived/check_nginx.sh - 返回值必须为 0(正常)或非 0(异常),Keepalived 仅依赖 exit code 判断
配置 vrrp_script 触发健康检查
在 /etc/keepalived/keepalived.conf 的 global_defs 下方添加:
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -5
fall 2
rise 1
}
-
interval 2:每 2 秒执行一次检测 -
weight -5:检测失败时,将当前节点优先级减 5,使其可能让出 VIP -
fall 2:连续失败 2 次才判定为故障 - 确保该 script 被引用到 vrrp_instance 的 track_script 中
通过 notify 脚本实现报警
在 vrrp_instance 块中加入 notify 指令,当状态切换(MASTER/BACKUP/FAULT)时调用外部脚本:
notify /etc/keepalived/notify.sh
/etc/keepalived/notify.sh 示例内容:
- 接收 $1 参数(如 master、backup、fault),$2 是 virtual router id
- 可根据状态调用企业微信机器人、钉钉 webhook、邮件命令(如
echo "Nginx down on $(hostname)" | mail -s "ALERT" admin@example.com) - 建议加日志记录:
echo "$(date): $1 event triggered" >> /var/log/keepalived_notify.log - 注意脚本要有执行权限,且路径在 keepalived 可访问范围内(避免 SELinux 或权限拦截)
验证与调试要点
启动前务必测试各环节是否生效:
- 手动运行
/etc/keepalived/check_nginx.sh,确认返回值符合预期 - 停止 Nginx 后观察 keepalived 日志(
journalctl -u keepalived -f),看是否触发 weight 变化或状态切换 - 检查 notify.sh 是否被调用、报警是否发出(先用 echo 测试输出)
- 多个节点间 VIP 漂移需确保防火墙放行 VRRP 协议(协议号 112,通常用组播 224.0.0.18)











