轮询模式需配合健康检查才能自动规避故障节点;nginx默认轮询不检测后端存活,须配置max_fails、fail_timeout及proxy_next_upstream等参数实现被动健康检查与错误重试。

轮询模式本身不自动剔除故障节点,必须配合健康检查机制才能实现后端异常时的自动规避。
轮询默认行为与局限
Nginx 的默认轮询(round-robin)只是按顺序分发请求,不检测后端是否存活。哪怕某台服务器已关机或网络不通,Nginx 仍会把请求发过去,超时后返回 502/504 错误,且下次请求还会继续尝试——这会拖慢整体响应,影响用户体验。
启用被动健康检查(推荐基础方案)
在 upstream 块中为每个 server 设置容错参数,让 Nginx 在连续失败后临时屏蔽该节点:
-
max_fails:允许连续失败的次数(默认为 1),比如设为
max_fails=3 -
fail_timeout:失败达到阈值后,该节点被标记为不可用的时间窗口(如
fail_timeout=30s) - 失败判定依据是连接超时、5xx 响应或 proxy_pass 无法建立连接
示例配置:
upstream backend {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
}
配合 proxy_next_upstream 主动跳过失败
仅靠 upstream 屏蔽还不够,需在 location 中启用错误转发策略:
- 添加
proxy_next_upstream error timeout http_500 http_502 http_503 http_504; - 这样当某次请求遇到指定错误时,Nginx 会自动重试下一个 upstream server,用户无感知
- 注意:
http_500等需明确列出,不能只写http_50x
避免单点雪崩:合理设置超时与重试
若后端响应极慢或卡死,不加限制会导致 worker 连接堆积:
-
proxy_connect_timeout 5s;—— 建立连接上限 -
proxy_send_timeout 10s;—— 发送请求体超时 -
proxy_read_timeout 10s;—— 等待后端响应超时 - 重试次数建议不超过 2 次(
proxy_next_upstream_tries 2;),防止放大压力











