nginx高可用灾备演练核心是验证故障时流量能否秒级、无感、不乱序切至备用节点,需覆盖进程崩溃、服务假死、网络隔离三类真实故障,结合客户端行为、日志比对、关键日志与监控指标交叉验证切换真实性及业务连续性。

生产环境中的 Nginx 高可用灾备演练,核心不是“配完能切”,而是验证故障发生时流量是否真能秒级、无感、不乱序地落到备用节点。验证必须覆盖真实故障类型、可观测切换过程、并确认业务连续性。
分层模拟三类典型故障
只杀 nginx 进程太理想化,掩盖了健康检查失效风险。要分别触发:
-
进程崩溃:在主节点执行
systemctl stop nginx或kill -9 $(pgrep nginx),观察 Keepalived 是否通过nginx_check.sh检测失败、降权,并在 3–5 秒内完成 VIP 漂移; -
服务假死:临时修改 nginx 配置,让
/health接口返回 503 或超时(如 proxy_pass 指向一个关机的后端),验证主动探测能否识别 HTTP 层异常,而非仅依赖进程存在; -
网络隔离:在主节点运行
iptables -A OUTPUT -p vrrp -j DROP,模拟心跳中断,检验 VRRP 选举行为是否稳定,避免因多播阻断导致脑裂。
用客户端行为验证真实连续性
不能只看 VIP 能 ping 通或 curl 返回 HTML——要模拟用户真实访问:
- 在客户端持续执行:
watch -n 0.2 'curl -sI http://VIP | head -1 2>/dev/null',切换瞬间最多容忍 1–2 次Connection refused或超时,之后应立即恢复HTTP/1.1 200 OK; - 用浏览器反复 F5 刷新页面,或跑长连接压测:
ab -n 1000 -c 50 http://VIP/,确认失败请求数为 0; - 比对主备节点的
access.log:主节点最后一条日志时间戳,应与备节点第一条日志时间戳无缝衔接(误差 ≤ 1 秒)。
查关键日志定位是否真切换成功
切换是否生效,不靠猜测,靠三处输出交叉验证:
-
VIP 绑定状态:在主备节点分别执行
ip a | grep "inet.*VIP",故障期间 VIP 应仅出现在备机网卡上; -
Keepalived 状态流:查
tail -f /var/log/messages | grep Keepalived,应看到完整状态变迁,例如:MASTER → FAULT → BACKUP(主),BACKUP → MASTER(备); -
Nginx 服务响应:在备机上执行
curl -s http://127.0.0.1/health,确保其返回 200 且内容与主节点一致,排除配置不同步导致的“切得动但服务不对”问题。
配套监控让验证可回溯
单次手动验证不够,需建立可持续观测能力:
- 用 Prometheus + node_exporter 监控
keepalived_process_status、nginx_worker_processes、ip_addr_count{vip="192.168.x.130"}三个指标; - 设置告警规则:当 VIP 同时出现在两台机器、或备机未在 6 秒内升为 MASTER,立即通知;
- 每次演练后生成报告:记录故障注入方式、VIP 漂移耗时、首条成功请求时间、最大中断窗口,形成 RTO 基线。











