nginx通过权重分配、被动容错(max_fails/fail_timeout)和请求级重试(proxy_next_upstream)协同实现自动故障转移:weight仅影响健康节点的流量比例,故障时由max_fails标记节点、fail_timeout控制隔离时长,proxy_next_upstream在单次请求失败时换节点重试,backup节点作为最后兜底。

Nginx 本身不直接“按权重触发故障转移”,而是通过 权重分配 + 被动容错机制 + 请求级重试 协同实现:权重影响正常流量分发比例,故障发生后由 max_fails/fail_timeout 标记节点不可用,再靠 proxy_next_upstream 触发换节点重试——整个过程自动完成,无需手动切换。
权重配置决定初始流量分配
权重(weight)只在所有节点都健康时起作用,数值越大,单位时间内接收的请求越多。它不参与故障判断,也不改变节点下线逻辑,但会影响故障期间剩余节点的负载压力分布。
- 默认权重为
1,可显式设置如weight=3 - 权重与
max_fails、fail_timeout独立配置,互不影响 - 示例:
upstream backend { server 192.168.1.10:8080 weight=3 max_fails=3 fail_timeout=30s; server 192.168.1.11:8080 weight=1 max_fails=3 fail_timeout=30s; server 192.168.1.12:8080 backup; }正常时,
1.10接收约 75% 流量;一旦它连续失败 3 次,30 秒内被跳过,全部流量转向1.11(及1.12,若1.11也失效)。
被动容错机制标记故障节点
Nginx 在请求过程中自动记录失败行为,并依据 max_fails 和 fail_timeout 将节点临时标记为 down:
-
max_fails=3:连续 3 次失败(连接拒绝、超时、5xx 响应等)即触发标记 -
fail_timeout=30s:该节点被标记为down的持续时间,同时也是“连续失败”的统计窗口 - 标记后,Nginx 不再向该节点转发新请求,已建立的连接不受影响
- 30 秒后自动尝试恢复——下一次请求会再次探测,成功则重新纳入轮询
注意:仅靠被动容错无法实时感知节点宕机(需等待首次失败),适合对响应延迟不敏感的场景。
请求级重试确保单次调用不失败
即使上游节点已被标记为 down,单个用户请求仍可能因网络抖动、瞬时超时而失败。此时需 proxy_next_upstream 主动换节点重试:
- 在
location块中配置,作用于本次请求生命周期 - 常用触发条件:
-
error:连接后端失败(如 refused、DNS 解析失败) -
timeout:建立连接或等待响应超时 -
http_500 http_502 http_503 http_504:收到网关类错误响应
-
- 可搭配
proxy_next_upstream_tries限制最大重试次数(默认 0,不限制) - 示例:
location / { proxy_pass http://backend; proxy_next_upstream error timeout http_500 http_502 http_503 http_504; proxy_next_upstream_tries 2; }表示最多尝试 3 次(原始 + 2 次重试),每次换不同可用节点。
备用节点兜底保障服务连续性
backup 参数用于定义灾备节点,仅当所有非 backup 节点均被标记为 down 时才启用:
- 不参与常规负载分发,不消耗性能资源
- 无
weight、max_fails等参数限制(但可加,仅作参考) - 适合部署在独立网络区域或低配机器上,作为最后防线
- 示例中
192.168.1.12就是典型 backup 节点,平时闲置,故障时自动激活
不复杂但容易忽略











