应使用 backup 参数而非权重实现“主全挂才启用备用”,因权重仅影响请求分发比例,不参与健康状态判定;需配合 max_fails、fail_timeout 和 proxy_next_upstream 实现故障隔离与自动切换。

直接用 backup 参数,而不是靠权重(weight)来实现“主全挂才启用备用机”。Nginx 的轮询权重机制(如 weight=1、weight=10)本身不具备故障隔离能力——它只是按比例分发请求,即使某节点已不可用,只要没被标记为 down,仍可能被选中。真要达成“主全挂才启用备用”,必须放弃用权重模拟 backup,改用标准的 backup 语义。
为什么不能靠低权重实现“最后启用”
权重仅影响调度概率,不参与健康状态判定:
- 即使设
server 192.168.1.10:8000 weight=100;和server 192.168.1.11:8000 weight=1;,只要后者在线,Nginx 就会持续给它转发约 1% 的流量 - 当主节点开始超时或返回 502,Nginx 不会自动把它“踢出轮询池”,除非你配置了
max_fails和fail_timeout - 权重节点不会等待其他节点全部失败才启动;它始终参与调度
正确做法:用 backup + 健康探测组合
把备用服务器显式声明为 backup,并确保主节点能被准确标记为不可用:
- 在
upstream块中,所有主节点不加任何修饰;备用节点末尾加上backup关键字 - 为主节点统一配置
max_fails=2 fail_timeout=15s,让连续两次失败就暂停转发 - 备用节点也建议配同样参数,防止它自己出问题后还被无条件启用
- 在
location中启用重试逻辑:proxy_next_upstream error timeout http_502 http_503 http_504
示例配置:
upstream app_backend {server 192.168.1.10:8000 max_fails=2 fail_timeout=15s;
server 192.168.1.11:8000 max_fails=2 fail_timeout=15s;
server 192.168.1.12:8000 backup max_fails=2 fail_timeout=15s;
}
补充兜底:后端全不可用时降级到静态页
如果连 backup 节点也失效,可再加一层防御:
- 开启
proxy_intercept_errors on;,拦截后端返回的错误响应 - 用
error_page 500 502 503 504 = @fallback;指向本地静态资源 - 定义
location @fallback,指定root /var/www/maint和默认首页 - 确保该路径下有
index.html,且 Nginx 已加载mime.types
验证是否生效的关键点
不要只看配置是否存在,重点验证行为逻辑:
- 停掉全部主节点,观察
nginx -T | grep "down"是否显示它们状态为 down - 发起请求,确认流量确实只打到 backup 节点(查其访问日志)
- 再停掉 backup 节点,检查是否返回预设的降级页,且响应头含
X-Downgraded: true - 恢复任意一台主节点后,确认流量自动切回主集群(Nginx 会在
fail_timeout后自动重试)











