Keepalived 通过自定义脚本(如检查端口、进程或健康接口)监控 Nginx 状态,异常时降低优先级或释放 VIP,触发 VRRP 切换;需配置 vrrp_script、track_script、fall/rise 参数,并配合 Nginx 健康接口、daemon 设置及稳定性策略防误切。

Keepalived 如何与 Nginx 协同实现高可用
Keepalived 本身不直接监控 Nginx 进程,而是通过自定义脚本检查 Nginx 服务状态(如端口响应、进程存在、健康接口返回),再根据检查结果触发 VIP 切换。核心逻辑是:当本地 Nginx 异常时,降低本节点优先级或主动释放 VIP,让备节点升主接管流量。
关键配置项与心跳检测机制
Keepalived 的心跳依赖 VRRP 协议,但“健康判断”需靠 vrrp_script 实现。常见做法如下:
- 定义检查脚本(如 /etc/keepalived/check_nginx.sh),用
curl -I http://127.0.0.1:80/health或kill -0 $(cat /var/run/nginx.pid)验证服务可用性 - 在 keepalived.conf 中注册该脚本,并设置
interval(如 2s)、fall(连续失败几次降权)、rise(恢复几次升权) - VRRP 实例中引用该脚本,并配置
track_script,同时设好priority和preempt_delay避免脑裂或频繁切换
避免误切与脑裂的实用策略
真实环境中,网络抖动或瞬时超时易引发 VIP 频繁漂移。可采取以下措施增强稳定性:
- 检查脚本内增加重试和延时,比如用
curl --max-time 1 --retry 2而非单次请求 - 将
fall 3和rise 2组合使用,要求连续 3 次失败才降权,连续 2 次成功才恢复权重 - 主备节点间确保时间同步(chrony/NTP),并关闭防火墙对 VRRP 组播(224.0.0.18)和 ICMP 的拦截
- 在双主或跨机房场景下,慎用
preempt,建议配合notify_master脚本做二次确认(如写入共享存储标记)
Nginx 端需配合的细节
Keepalived 只管 VIP 和切换,Nginx 自身需适配高可用场景:
- 启用
daemon off;或确保 systemd 启动时正确管理主进程,避免 fork 后 keepalived 无法准确 kill - 配置独立健康检查接口(如
location /health { return 200 'OK'; }),不依赖业务路径,防止因后端异常误判 Nginx 故障 - 日志输出到 stdout/stderr(若容器部署)或统一路径,便于脚本结合
grep -q "worker process is shutting down"做更细粒度判断


















