Nginx通过weight+max_fails/fail_timeout实现主备式故障转移:高权值节点作主,低权值节点作备;主节点连续失败后被临时剔除,流量自动切至备用节点,配合proxy_next_upstream确保请求级重试。

Nginx 本身不直接支持“主备服务器”的自动故障转移(即热备切换),但可以通过 upstream 模块配合健康检查机制,实现类似主备效果的**主动故障转移**——本质是将一台服务器设为高优先级(主),另一台设为低优先级(备),并在主宕机时自动将流量切到备机。
用 weight + max_fails/fail_timeout 模拟主备
这是最常用、无需额外模块的方式。核心思路:给主服务器设置更高权重,并配置失败重试策略;当主不可用时,Nginx 自动降权并转发请求到备机。
示例配置:
upstream backend {
# 主服务器:权重高,允许最多 1 次失败,30 秒内不重试
server 192.168.1.10:8080 weight=10 max_fails=1 fail_timeout=30s;
<pre class='brush:php;toolbar:false;'># 备服务器:权重低,作为兜底
server 192.168.1.20:8080 weight=1 max_fails=3 fail_timeout=60s;}
server { listen 80; server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}}
- weight=10 vs weight=1:默认轮询下,主机会承接绝大多数请求;权重差异越大,“主备感”越强
- max_fails/fail_timeout:Nginx 在指定时间内连续失败达到阈值后,会临时屏蔽该节点,后续请求只发给可用节点
- 注意:Nginx 的健康检查是被动的(依赖真实请求失败),不是主动探测,所以首次失败会有短暂影响
启用主动健康检查(需 Nginx Plus 或开源版 + 模块)
如果需要真正主动探测(如定时发 HTTP HEAD 请求),标准开源 Nginx 不支持,但有替代方案:
-
Nginx Plus:原生支持
health_check指令,可配置间隔、路径、状态码等 -
开源 Nginx + nginx_upstream_check_module:第三方模块,需重新编译安装,启用后可在 upstream 中添加
check参数 - 外部工具辅助:用 Consul + nginx-upsync-module 或 etcd + dynamic upstream 脚本,由外部服务发现机制动态更新 upstream 配置
确保故障转移可靠的关键细节
-
proxy_next_upstream 必须配置,否则单次失败就直接返回错误,不会尝试备用节点:
proxy_next_upstream error timeout http_500 http_502 http_503 http_504; - proxy_next_upstream_tries 和 proxy_next_upstream_timeout 控制重试次数和总超时,避免卡死
- 后端应用需正确返回状态码(如 503 表示暂时不可用),否则 Nginx 无法识别“软故障”
- 建议开启
keepalive连接复用,减少建连开销,加快恢复响应
验证与观察方法
- 用
curl -I http://example.com多次测试,观察响应头中的Server或自定义 Header 区分后端 - 停掉主服务器,观察日志:
/var/log/nginx/error.log中应出现no live upstreams后快速切到备机 - 通过
nginx -t && nginx -s reload热重载配置,避免中断 - 使用
stub_status或第三方模块暴露 upstream 状态,便于监控


















