keepalived 通过自定义健康检查脚本(如 curl 探测 /health 或 kill -0 检查进程)实现对 nginx 的秒级监控,需配置 vrrp_script、track_script、interval 2、rise 2、fall 3,并确保 nginx 提供轻量健康端点及脚本可执行权限。

Keepalived 本身不直接监控 Nginx 进程或服务状态,它通过自定义健康检查脚本(如检测 Nginx 是否响应 HTTP 请求或进程是否存在)来实现对 Nginx 的秒级可用性判断,并在异常时触发 VIP 切换。关键在于配置合理的检查频率、超时机制和判定逻辑。
Keepalived 配置中启用健康检查
Keepalived 的 vrrp_script 段用于定义检测逻辑,需配合 track_script 绑定到 VRRP 实例。典型做法是用 curl 或 kill -0 检查 Nginx:
- 使用 HTTP 探测:脚本执行
curl -f http://127.0.0.1/health -o /dev/null -s -w "%{http_code}" | grep -q "200",返回 0 表示正常 - 使用进程检查:
kill -0 $(cat /var/run/nginx.pid) 2>/dev/null,验证主进程是否存活 - 脚本需有可执行权限(
chmod +x),且 Keepalived 启动用户(通常是 root)要有执行权限
控制检查频率与故障判定粒度
秒级监控依赖于 interval 和 rise/fall 参数组合:
-
interval 2表示每 2 秒执行一次检测,这是实际“秒级”的基础 -
rise 2表示连续 2 次成功才认为服务恢复,避免抖动误判 -
fall 3表示连续 3 次失败才触发故障转移,即最短 6 秒后切换 VIP - 注意:过短的 interval(如 1s)可能增加系统负载,尤其在高并发集群中需权衡
确保 Nginx 自身具备健康检查端点
若采用 HTTP 探测方式,Nginx 需暴露一个轻量、稳定、不依赖业务逻辑的健康接口:
- 推荐在 server 块中添加 location:
location /health { return 200 'OK\n'; add_header Content-Type text/plain; } - 避免使用依赖 upstream 或复杂 rewrite 的路径,防止探针因业务异常而误报
- 该端点应绕过所有 access_log 和 limit_req,降低开销
日志与排错要点
Keepalived 默认日志输出较简略,需主动增强可观测性:
- 在 vrrp_script 脚本开头加入
logger -t keepalived-check "nginx check: $(date)"记录执行时间 - 检查
/var/log/messages或 journalctl -u keepalived 查看状态切换记录 - 手动运行检查脚本,确认返回值符合预期(0=健康,非0=异常),Keepalived 仅依赖 exit code 判定
- 注意 SELinux 或 systemd 环境下脚本调用外部命令(如 curl)可能被限制,需适当放行











