Nginx官方版不支持主动健康检查,但可通过被动健康检查实现自动故障隔离:在upstream中配置max_fails和fail_timeout参数,配合proxy_next_upstream指定失败条件,结合weight、least_conn等负载策略及backup、slow_start等增强机制,即可构建稳定生产级负载均衡。

Nginx 官方版不支持主动健康检查(如定期发 /health 请求探测),但可通过 被动健康检查 + 合理策略配置 实现稳定、自动的故障隔离与流量调度。核心在 upstream 块中合理使用 server 指令参数和负载算法,无需额外模块即可投入生产。
健康检查:靠 max_fails 和 fail_timeout 实现被动检测
这是 Nginx 原生支持的方式——当某台后端连续失败达到阈值,Nginx 会临时将其标记为不可用,在指定时间内不再转发请求。
-
max_fails=3:在fail_timeout时间窗口内,最多允许 3 次失败(连接超时、502/503/504 等) -
fail_timeout=30s:该时间既是失败统计周期,也是服务器被标记为“不可用”的持续时长 - 失败判定由
proxy_next_upstream控制,需在location中显式配置,例如:proxy_next_upstream error timeout http_502 http_503;
负载均衡策略:四类常用方式及适用场景
策略通过在 upstream 块顶部添加指令启用,不同策略可配合健康检查参数共存。
- 轮询(默认):不写任何策略指令即生效,请求按顺序分发到各 server,适合后端性能相近、无状态服务
-
加权轮询:用
weight=数字设置权重,例如server 192.168.1.10:8080 weight=3;,适用于混合规格机器(如 8C16G 和 4C8G) -
IP Hash:添加
ip_hash;指令,根据客户端 IP 的哈希值固定路由,保障会话粘性(注意:IPv6 或代理环境下需配合$http_x_forwarded_for处理) -
最少连接数:添加
least_conn;,优先将新请求发给当前活跃连接最少的后端,适合长连接或响应时间差异大的服务
增强可用性:backup、down 和 slow_start
这些参数让 upstream 更贴近真实运维需求:
-
backup:标记为备用服务器,仅当所有非 backup 服务器都不可用时才启用 -
down:手动下线某节点,Nginx 完全忽略它(常用于维护前静态屏蔽) -
slow_start=30s:服务器从失败恢复后,权重从 0 缓慢升至设定值,避免刚恢复就承受满载流量(注意:该参数要求 upstream 必须定义zone,且仅在共享内存模式下生效)
完整配置示例(含健康检查与加权轮询)
以下是一个兼顾稳定性与灵活性的典型配置:
upstream app_cluster {
# 加权轮询 + 被动健康检查
server 192.168.1.10:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 weight=2 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 backup;
<pre class='brush:php;toolbar:false;'># 可选:启用最少连接策略(与 weight 不冲突,但实际分配受连接数影响更大)
# least_conn;} server { listen 80; location / { proxy_pass https://www.php.cn/link/bc0308d39492ce39052c903d8ccacdbe; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 触发重试的关键:定义哪些响应算“失败”
proxy_next_upstream error timeout http_502 http_503 http_504;
proxy_connect_timeout 5s;
proxy_read_timeout 30s;
proxy_send_timeout 30s;
}}


















