Nginx轮询本身无重试,需配合proxy_next_upstream(显式配置error/timeout/5xx)、proxy_next_upstream_tries、proxy_next_upstream_timeout及upstream中max_fails/fail_timeout实现失败跳过与备用节点重试。

Nginx 的轮询算法本身不带重试逻辑,但可通过 proxy_next_upstream 指令配合超时与错误码触发自动重试,并结合 max_fails/fail_timeout 实现“失败跳过 + 重试备用节点”的完整容错流程。关键在于把重试行为和节点健康标记分开配置,二者协同工作。
轮询中启用超时重试的必要配置项
-
proxy_next_upstream决定什么情况下尝试下一个后端
必须显式开启,否则即使超时或出错,Nginx 也只发一次请求就返回错误
常用组合:proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
表示遇到连接失败、超时、或指定的 5xx 状态码时,将请求转发给列表中的下一台服务器(仍在轮询序列内)
-
proxy_next_upstream_tries限制最多重试几次(含首次)
默认为 0(不限),建议设为 3 或 5,避免无限循环proxy_next_upstream_tries 3;
-
proxy_next_upstream_timeout限制整个重试过程总耗时
超过该时间直接返回错误,不等所有重试完成proxy_next_upstream_timeout 10s;
-
proxy_connect_timeout/proxy_send_timeout/proxy_read_timeout
控制单次请求各阶段超时,直接影响是否触发proxy_next_upstream
示例(较保守值):proxy_connect_timeout 5s; proxy_send_timeout 10s; proxy_read_timeout 10s;
健康检查参数让轮询真正“跳过故障节点”
仅靠重试不够——若某台服务器持续超时,每次都要试一遍再重试,效率低且加重压力。需搭配:
-
max_fails=3 fail_timeout=30s(写在upstream的server行后)
表示连续 3 次失败(由proxy_next_upstream判定的失败也算)后,该节点被标记为不可用,30 秒内不再参与轮询分发upstream backend { server 192.168.1.10:80 max_fails=3 fail_timeout=30s; server 192.168.1.11:80 max_fails=3 fail_timeout=30s; server 192.168.1.12:80 max_fails=3 fail_timeout=30s; }
注意:
max_fails统计的是被proxy_next_upstream认定为“可重试的失败”,不是所有响应都计入。比如http_404不在默认重试列表里,就不会触发计数。
完整可运行配置片段
http {
upstream backend {
server 192.168.1.10:80 max_fails=3 fail_timeout=30s;
server 192.168.1.11:80 max_fails=3 fail_timeout=30s;
server 192.168.1.12:80 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
location / {
proxy_pass http://backend;
# 关键:启用重试条件
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 10s;
# 单次请求超时控制
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
# 透传头信息(常规建议)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}验证是否生效的小技巧
- 临时停掉其中一台后端(如
192.168.1.11),用curl -v http://your-nginx/多次请求
正常应看到:前几次可能返回 502(连不上),很快转到其他节点并成功;同时nginx error.log中出现upstream timed out或no live upstreams相关记录 - 查看
upstream状态:启用stub_status或第三方模块(如nginx-upstream-check-module)可实时观察节点是否被标记为unavailable - 日志中搜索
*upstream* retries:字样,确认重试次数是否符合预期
这套组合不依赖外部组件,是 Nginx 原生支持的轻量级高可用方案。


















