keepalived 通过自定义脚本检测 nginx 健康状态并控制 vip 切换,主从角色由优先级和 state 决定,需配置 vrrp_script、防火墙放行 vrrp、启用 ip_nonlocal_bind,并验证日志与 ip 漂移。

Keepalived 本身不直接监控 Nginx 的主从状态,而是通过自定义脚本检测 Nginx 进程或服务健康状况,并基于结果触发 VIP(虚拟 IP)的接管或释放,从而实现高可用切换。所谓“Nginx 主从”,实际是 Keepalived 管理的两个节点中,一个运行 Nginx 并持有 VIP(MASTER),另一个待命(BACKUP);切换逻辑由 Keepalived 控制,而非 Nginx 自身主从。
配置 Keepalived 检测 Nginx 健康状态
Keepalived 使用 vrrp_script 定义检测逻辑,常见方式包括:
- 检查 Nginx 进程是否存在:
killall -0 nginx && exit 0 || exit 1 - 检查本地端口是否可访问:
curl -f http://127.0.0.1:80/health || exit 1(需 Nginx 配置 /health 返回 200) - 组合检测(进程 + 端口):更稳妥,避免进程僵死但服务无响应的情况
该脚本需赋予可执行权限(如 chmod +x /etc/keepalived/check_nginx.sh),并在 keepalived.conf 中引用。
设置 MASTER/BACKUP 角色与优先级
两台服务器共用同一 vrrp_instance 名称和 virtual_router_id,但优先级不同:
- 主节点设
priority 100,状态为state MASTER - 备节点设
priority 90,状态为state BACKUP - 当主节点的 Nginx 异常,检测脚本失败 → weight 减值 → 优先级低于备节点 → VIP 自动漂移到备机
注意:BACKUP 节点的 state 不影响初始角色,最终以优先级为准;若优先级相同,则 state 决定初始 MASTER。
同步防火墙与网络配置
VIP 切换依赖组播通信(默认 224.0.0.18)和内核参数支持:
- 开放 VRRP 协议:firewalld 中执行
firewall-cmd --add-protocol=vrrp --permanent - 启用非本地 VIP 绑定:
echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf && sysctl -p - 确认网卡支持多播,且两节点在同一个二层网络(或正确配置 VRRP 单播)
验证与常见问题排查
启动后检查关键项:
- 运行
ip addr show查看 VIP 是否出现在预期网卡上 - 查看日志:
journalctl -u keepalived -f,关注 “Entering MASTER STATE” 或 “Transition to MASTER/BACKUP” - 手动停掉主节点 Nginx,观察 VIP 是否 2–5 秒内迁移;恢复后是否按 nopreempt 设置决定是否抢回
- 常见失败原因:脚本权限/路径错误、SELinux 阻止执行、防火墙拦截 VRRP、virtual_router_id 不一致
不复杂但容易忽略细节。











