nginx+keepalived双机热备可靠性验证需通过自动化测试模拟真实故障:运行健康检查脚本(进程+端口+http探针)、一键故障注入(停nginx/断网/封vrrp)、观测vip漂移与服务恢复、日志回溯切换时序,并覆盖网络分区等边界场景。

要验证 Nginx + Keepalived 双机热备主从切换是否真正可靠,不能只靠“配置完就认为能用”,必须做有针对性的自动化测试。核心是模拟真实故障场景,观察 VIP 漂移、服务接管和恢复行为是否符合预期。
准备可重复执行的健康检查脚本
Keepalived 依赖外部脚本判断 Nginx 是否存活,这个脚本就是自动测试的起点。建议使用轻量、稳定、可复现的方式:
- 脚本应同时检查 Nginx 进程(
pgrep -f "nginx: master")和端口监听(ss -tln | grep ':80'),避免仅查进程被假死干扰 - 加入 HTTP 健康探针:用
curl -sf http://127.0.0.1/healthz -o /dev/null,返回 200 才算通过(需在 Nginx 配置中添加对应 location) - 脚本末尾用
exit 0(健康)或exit 1(异常),Keepalived 的track_script才能正确响应 - 把脚本放在统一路径如
/etc/keepalived/check_nginx.sh,并确保两台机器权限一致(chmod +x)
编写一键式故障注入与状态观测脚本
人工 kill 进程或停服务容易遗漏细节,用脚本统一触发+验证,提升测试一致性:
- 在主节点执行:
systemctl stop nginx或kill -9 $(cat /usr/local/nginx/logs/nginx.pid) - 等待 2–3 秒(取决于
advert_int和track_script interval设置) - 立即检查:
ip addr show | grep "inet.*192.168.x.x/24"确认 VIP 是否已出现在备机网卡 - 用
curl -I http://VIP验证服务是否可响应,记录耗时(正常应在 1 秒内完成切换) - 恢复主节点 Nginx 后,再观察 VIP 是否按预期“漂回”(若配置为非抢占模式则不回切)
用日志和时间戳做切换过程回溯
自动测试不是只看结果,更要确认过程是否合规。Keepalived 默认日志在 /var/log/messages,可提取关键事件:
- 过滤关键词:
grep "VI_1.*transition" /var/log/messages,查看 MASTER → BACKUP 或 BACKUP → MASTER 的切换记录 - 结合时间戳比对:主节点停止 Nginx 的时间、Keepalived 检测失败时间、VIP 删除时间、备机 VIP 添加时间、HTTP 恢复响应时间
- 建议测试前清空日志:
truncate -s 0 /var/log/messages,避免干扰;也可临时启用 debug 日志(debug参数加到global_defs)
模拟网络层中断等边界场景
真实故障不止是 Nginx 崩溃,还需覆盖更隐蔽的失效路径:
- 禁用主节点网卡:
ip link set eth0 down,验证 VRRP 报文丢失后是否触发切换 - 阻断 Keepalived 心跳包:
iptables -A OUTPUT -p vrrp -j DROP,模拟网络分区(split-brain)情况 - 故意设错
virtual_router_id或auth_pass,验证两节点无法形成 VRRP 组,避免误双主 - 每种操作后都执行完整状态检查,确保无脑切换不会导致服务中断或 VIP 冲突











