Nginx与Keepalived高可用需构建“可感知、可响应、可收敛”闭环:健康检查须穿透业务层,切换逻辑需权重+时间窗防抖动,配置与资源必须严格同步,验证须覆盖端到端故障链路。
要让 Nginx 与 Keepalived 真正支撑起分布式服务的高可用,关键不是堆机器,而是构建一套“可感知、可响应、可收敛”的闭环机制。它不单是 VIP 漂移,而是把服务健康状态、网络连通性、配置一致性、切换行为全部纳入可控范围。
只检测 Nginx 进程是否存活远远不够——进程在,但 upstream 全挂、SSL 加载失败、location 配置被误删,用户照样打不开报表或登录页。真实可用性检查得层层递进:
kill -0 $(cat /var/run/nginx.pid 2>/dev/null)
ss -tln | grep -q ':443$'(别只查 80)curl -f http://127.0.0.1/healthz -s -o /dev/null -w '%{http_code}',需在 Nginx 中明确定义 location /healthz { return 200; }
切换不是靠“感觉”,而是靠权重变化和时间窗口双重约束:
priority 100,备节点 priority 90,差值设为 5~10,留出缓冲空间vrrp_script 中 weight -5 + interval 2 + timeout 3,确保两次失败才触发降权,避免瞬时卡顿误判preempt_delay 30,主恢复后等待半分钟再尝试抢主,防止网络抖动引发反复切换virtual_router_id 和 auth_pass 主备必须完全一致,否则 VRRP 报文根本收不到VIP 漂过去只是第一步,备机能否无缝承接,取决于配置与资源是否同步:
nginx.conf 及 include 的所有子配置)需用 rsync 或 Ansible 定期同步,禁止手工修改备机notify_master 和 notify_backup 脚本,在角色变更时自动 reload Nginx、清理本地缓存、推送告警不能只 ping VIP 或看 ip addr,要走通端到端请求流:
kill -9 $(cat /var/run/nginx.pid) 强制终止主节点 Nginx,观察 VIP 是否 3 秒内出现在备机 ip addr 输出中while true; do curl -s -w "%{http_code}n" http://VIP/healthz; sleep 0.5; done,确认 HTTP 状态码从 000 → 502 → 200 的完整过渡