Nginx主备切换通过backup参数与健康探测配合实现服务不中断:主节点可用时backup节点不参与流量,主节点失败后自动启用首个可用backup节点,并支持error_page接口级降级和日志可观测性验证。

当主服务器宕机或响应超时时,Nginx 网关可自动将请求转发到预先配置的 Backup 服务器,实现服务不中断——这不是负载均衡,而是明确的“主备切换”,关键在 backup 参数与健康探测的配合。
一、基础 backup 配置:主备识别靠关键字
Nginx 的 upstream 模块通过 backup 指令标记备用节点。只要主节点可用(未被标记 down),Backup 节点就完全不参与流量分发:
upstream api_backend {
server 192.168.1.10:8080; # 主服务,无任何标记
server 192.168.1.11:8080 backup; # 备用服务,显式加 backup
}
- Backup 节点默认不接收任何请求,即使其他节点负载低也不抢流量
- 多个 backup 节点之间按权重或轮询调度(若都标 backup)
- 一旦主节点失效(如连接拒绝、超时),Nginx 自动启用第一个可用 backup 节点
二、让 backup 真正“智能启用”:必须搭配健康检查
仅写 backup 不够——Nginx 默认不会主动探测主节点是否存活。需启用 health_check(需 stream 或 http 模块支持)或借助 max_fails + fail_timeout 实现被动探测:
upstream api_backend {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 backup max_fails=3 fail_timeout=30s;
}
-
max_fails=3表示连续 3 次失败(连接超时、5xx、无效响应等)后标记为不可用 -
fail_timeout=30s指该节点被标记为 down 后,30 秒内不再尝试,之后重新试探 - 主节点被标记为 down 后,backup 节点立即接管;主节点恢复后,自动切回(无需 reload)
三、降级策略增强:结合 error_page 实现接口级兜底
Backup 是服务级灾备,但某些场景需要更细粒度控制——比如 /payment 接口主备都不可用时,返回预设降级响应:
location /payment {
proxy_pass http://api_backend;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 2;
<pre class='brush:php;toolbar:false;'>error_page 502 503 504 = @fallback_payment;}
location @fallback_payment { add_header X-Fallback "true"; return 200 '{"code":2001,"msg":"支付服务临时降级,稍后重试"}'; }
-
proxy_next_upstream定义哪些错误触发重试(包括重试 backup) -
proxy_next_upstream_tries控制最多重试次数(含初始请求) -
error_page在所有上游均失败后,跳转至本地兜底逻辑,避免用户看到 502/503
四、验证与可观测性:确认 backup 是否真正生效
上线前务必验证主备切换行为,避免配置静默失效:
- 手动停掉主服务(
systemctl stop app-main),curl 测试接口,观察响应 IP 或日志是否来自 backup 机器 - 检查 Nginx error log:
upstream prematurely closed connection或no live upstreams提示说明切换异常 - 启用
log_format记录 upstream_addr,便于追踪每次请求实际打到哪台机器 - 对 backup 服务也做轻量健康探针(如 /health),避免 backup 本身已宕却无法感知

















