Nginx与Keepalived联动的核心是通过多层健康检查脚本将Nginx真实状态转化为Keepalived可识别信号,结合vrrp_script权重机制实现3秒内自动VIP漂移,需严格配置防脑裂、同步资源并验证端到端可用性。

Nginx 与 Keepalived 联动的核心,不是让 Keepalived 去“管” Nginx,而是通过脚本把 Nginx 的真实健康状态翻译成 Keepalived 能理解的信号——健康就维持主节点身份,异常就触发 VIP 漂移。整个过程不依赖人工干预,3 秒内完成切换,关键在逻辑闭环和细节控制。
健康检查脚本必须多层验证
单靠 `ps | grep nginx` 容易误判:进程还在但端口没监听、HTTP 返回 502、配置加载失败却未退出……这些都得覆盖: - 用 `kill -0 $(cat /var/run/nginx.pid 2>/dev/null)` 判断主进程是否存在且有权限访问 - 用 `ss -tln | grep -q ':80$'` 或 `nc -z 127.0.0.1 80` 确认端口真实监听 - 用 `curl -f http://127.0.0.1/healthz -o /dev/null -s -w '%{http_code}' | grep -q '200'` 检查业务级可用性(需在 Nginx 中配 `location /healthz { return 200; }`) - 所有判断结果汇总为统一 exit 码:成功返回 `0`,任一环节失败返回非 `0`Keepalived 配置要精准绑定权重变化
脚本只是“传感器”,真正驱动切换的是 `vrrp_script` 的权重机制: - 在全局块定义: ```conf vrrp_script chk_nginx { script "/opt/scripts/check_nginx.sh" interval 2 # 每2秒执行一次 timeout 3 # 脚本超时强制终止,防卡死 weight -5 # 每次失败降低优先级5点 } ``` - 在 `vrrp_instance` 中引用: ```conf track_script { chk_nginx } ``` - 主节点初始 `priority 100`,备节点 `priority 90`;当主节点连续失败 2 次,优先级降到 90 以下,自动触发 MASTER → BACKUP 切换避免脑裂和频繁抖动切换
瞬时网络延迟或 Nginx 短暂卡顿不该引发切换: - 备节点启用 `preempt_delay 30`,主恢复后等待 30 秒再抢主,防止闪断反复切 - 主备节点的 `virtual_router_id`、`auth_pass` 必须完全一致,否则 VRRP 无法通信 - 同步 Nginx 配置、静态资源、SSL 证书路径,确保接管后行为零差异 - 加入 `notify_master /opt/scripts/notify.sh` 等通知脚本,在角色变更时记录日志或清理缓存验证不能只看 VIP 是否漂移
真实可用性才是最终标准: - 模拟故障:`kill -9 $(cat /var/run/nginx.pid)`,观察 `ip addr show` 中 VIP 是否已出现在备机 - 同时发起持续请求:`while true; do curl -s -o /dev/null -w "%{http_code}\n" http://192.0.2.100; sleep 0.1; done`,确认无 5xx 或超时 - 查看 Keepalived 日志:`tail -f /var/log/messages | grep "VI_1"`,确认状态转换日志完整(如 `Entering MASTER STATE`) - 检查脚本权限:`ls -l /opt/scripts/check_nginx.sh` 必须有 `+x`,路径在配置中写绝对路径,避免执行失败静默失效不复杂但容易忽略


















