Nginx多集群故障转移预演需结合反向代理、健康检查与动态权重,通过主动注入故障、变量控制切流、端到端验证及恢复流程闭环验证切换可靠性。

通过 Nginx 实现多集群架构的故障转移预演,核心在于利用 Nginx 的反向代理、健康检查与动态权重能力,模拟真实故障场景并验证切换逻辑是否可靠。关键不是“等故障发生”,而是主动制造可控异常,观察流量是否按预期路由到备用集群。
配置上游集群并启用主动健康检查
Nginx 官方版(1.11.5+)原生支持 health_check 指令,但仅限于商业版 Nginx Plus;开源版需借助 nginx_upstream_check_module(需编译安装)或用被动检查 + 自定义探针兜底。
- 为每个业务集群定义独立 upstream,例如
upstream cluster-a和upstream cluster-b - 在 upstream 中为每台后端服务器设置
max_fails=2 fail_timeout=30s,让 Nginx 在连续失败后临时摘除节点 - 若使用 check 模块,添加
check interval=3 rise=2 fall=3 timeout=1 type=http,并指定check_http_send和check_http_expect_alive验证健康接口返回码
通过变量与 map 实现运行时集群切换控制
避免硬编码主备关系,用 Nginx 变量 + map 指令实现“开关式”流量调度,便于预演中快速切流。
- 定义一个可被外部修改的控制源,如读取请求头
X-Cluster-Mode或本地文件内容(配合ngx_http_realip_module或 Lua) - 用 map 将控制值映射为 upstream 名称:
map $http_x_cluster_mode $target_upstream { "a" "cluster-a"; "b" "cluster-b"; default "cluster-a"; } - 在 location 中使用
proxy_pass http://$target_upstream;,即可通过改 Header 或脚本触发切换
注入故障:手动模拟节点不可用
预演有效性取决于故障注入的真实性。不推荐直接关服务,而应分层模拟:
-
网络层隔离:在目标集群节点上执行
iptables -A OUTPUT -p tcp --dport 8080 -j DROP,模拟连接拒绝 -
应用层响应异常:用
curl -X POST http://node/health/fail触发服务主动返回 503(需业务配合提供熔断接口) -
DNS 解析干扰:修改 Nginx 所在机器的
/etc/hosts,将某集群域名指向 127.0.0.1 或无效 IP,测试 DNS 故障下的 fallback 行为
验证与可观测性:确认切换是否生效
不能只看 Nginx 日志,要建立端到端验证链路:
- 在每个集群入口加唯一响应头,如
add_header X-Cluster-ID "cluster-a-v2",用 curl 或 Postman 检查实际返回值 - 开启 Nginx stub_status,通过
http://localhost:8080/nginx_status查看各 upstream 的Active connections和Failed requests实时变化 - 结合 Prometheus + nginx-vts-exporter 抓取 upstream 状态指标,设置告警规则:当
nginx_upstream_peers_health_state == 0持续 10 秒即触发预演成功事件
不复杂但容易忽略的是——预演必须包含“恢复流程”。故障注入后,要手动或自动恢复节点,验证 Nginx 是否重新纳入健康池,且无长连接残留导致流量卡顿。整个过程建议用 Ansible 或 Shell 脚本编排,形成可重复执行的故障剧本。


















