proxy_next_upstream默认仅重试error和timeout,5xx状态码(如http_502)需显式配置才触发切换;必须配合upstream块、合理超时参数及多节点部署才能生效。

proxy_next_upstream 不是开个开关就能自动容错的,它必须和 upstream 块、超时参数、错误类型显式组合才生效;默认只重试 error 和 timeout,5xx 状态码(如 http_502)不配置就不会触发重试。
为什么加了 proxy_next_upstream 还不切换后端?
常见现象:后端返回 502 Bad Gateway,Nginx 却没转到下一台 server,直接返回错误。
-
proxy_next_upstream默认值是error timeout,http_502、http_503等 HTTP 状态码不会被纳入重试条件,必须手动列出 - 重试只在
location或server块中配置才生效,写在http块顶层但没被继承到具体路由时也无效 - 如果 upstream 里只有一个 server,即使配置了重试,也没“下一个”可切——
proxy_next_upstream本质是 failover,不是负载均衡 - 后端返回了合法 HTTP 响应(哪怕状态码是 502),Nginx 就认为连接成功,
error不触发;此时必须显式加上http_502才能重试
proxy_next_upstream 要配哪些错误类型才合理?
盲目加 http_404 或 http_500 容易引发重复提交(比如下单接口重试两次),真正该配的是「可安全重试」的失败场景:
-
error:必须保留,覆盖连接拒绝、reset、IO 错误等底层异常 -
timeout:必须保留,但要配合proxy_connect_timeout、proxy_read_timeout合理设值(例如proxy_read_timeout 15s,则proxy_next_upstream_timeout应 ≥15s) -
http_502、http_503、http_504:推荐加,这三类通常是后端瞬时不可用(进程挂了、过载、网关超时),重试有意义 -
invalid_header:建议加,防后端返回空响应或非法头(如缺失Status行) - 避免加
http_404、http_500:前者多为业务路径不存在,后者可能是逻辑错误,重试无意义甚至有害
proxy_next_upstream_tries 和 proxy_next_upstream_timeout 怎么设?
这两个参数控制重试的“力度”,设得太松没效果,太紧会放大延迟或重复问题:
-
proxy_next_upstream_tries:指**最多尝试多少次**(含首次),设为3表示最多发 3 次请求。注意:不是“额外重试 3 次” -
proxy_next_upstream_timeout:从**第一次请求发起开始计时**的总耗时上限,超时即终止重试并返回错误。若设为10s,而单次proxy_read_timeout是8s,那第二次重试根本来不及发出去 - 典型搭配:
proxy_next_upstream_tries 3+proxy_next_upstream_timeout 30s+proxy_read_timeout 10s,留出三次请求+网络抖动余量 - 不要设成
proxy_next_upstream_tries 10:后端已全挂时,Nginx 会串行试 10 次,用户等 100s 才看到错误
后端节点怎么才算“失效”?max_fails 和 fail_timeout 的实际作用
Nginx 不靠心跳探活,而是靠被动失败计数来标记节点失效,这个机制和 proxy_next_upstream 是联动的:
-
max_fails=3表示连续失败 3 次就标记该 server 为不可用;但只有某些错误会累加fails计数——error和timeout总是计入,http_502等只有在proxy_next_upstream中显式配置了才会计入 -
fail_timeout=30s不是指“30 秒后自动恢复”,而是指:从第一次失败开始的 30 秒内,只要失败次数 ≥max_fails,该节点就被置为 down;过了这 30 秒,下次请求会再试一次,成功就恢复,失败继续计数 - 所有 upstream server 都 down 时,Nginx 会强制轮询所有节点(包括标为 down 的),直到有任一节点响应成功——这是兜底行为,别依赖它
- backup server 只在其他全部不可用时启用,不参与常规轮询,也不受
max_fails影响
最常被忽略的一点:重试逻辑发生在 Nginx 内存中,不记录请求体是否已发送。如果后端已接收并处理了 POST 请求(比如扣款),重试会导致二次执行——所以幂等性必须由后端保障,Nginx 层无法解决。











