proxy_next_upstream 默认仅在 error 和 timeout 时重试,需显式添加 http_500、http_502、http_503、http_504 等才触发对应状态码重试;非幂等请求默认不重试,须谨慎启用 non_idempotent。

通过 proxy_next_upstream 指令,Nginx 可在上游服务器返回特定错误响应或超时时,自动将请求转发给下一个可用节点,实现后端故障的透明容错与重试,无需客户端感知。
哪些响应会触发重试
该指令默认只对连接失败、超时等网络层异常重试,不包括 HTTP 状态码。需显式配置才能对 500、502、503、504 等服务端错误重试:
-
error:与 upstream 建立连接失败(如目标宕机、拒绝连接) -
timeout:连接或响应超时(受proxy_connect_timeout和proxy_read_timeout控制) -
invalid_header:后端返回空响应或非法 HTTP 头 -
http_500、http_502、http_503、http_504:明确匹配对应状态码 -
http_404等也可启用,但需谨慎——404 通常是业务逻辑结果,非故障,不应盲目重试
必须配合的上游配置
仅开启 proxy_next_upstream 不足以生效,还需确保:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 使用
upstream块定义多个后端节点,例如:upstream backend { server 10.0.1.10:8080; server 10.0.1.11:8080; } - 设置合理的超时时间,避免重试延迟过长:
proxy_connect_timeout 5s;proxy_send_timeout 10s;proxy_read_timeout 10s; - 若需跳过已失败节点(如某台机器连续出错),可启用
upstream中的max_fails和fail_timeout实现被动健康检查
重试次数与限制技巧
Nginx 默认最多重试一次(即最多尝试两个节点),可通过 proxy_next_upstream_tries 调整上限,但要注意:
- 设为
3表示最多尝试 3 个不同节点(含首次),不是“重试 3 次” - 配合
proxy_next_upstream_timeout可限制整体重试耗时,防止长尾请求堆积 - 不建议盲目提高重试次数——若多数节点异常,应由服务发现或熔断机制介入,而非靠重试掩盖问题
验证是否生效的小方法
快速确认配置是否起作用:
- 临时停掉一个 upstream 节点,用
curl -v发起请求,观察响应头中的X-Upstream-Addr(可自定义添加)或响应体差异 - 在 Nginx error log 中开启
debug级别,搜索"next upstream"关键字,能看到具体切换原因和目标 - 注意:GET 请求默认可重试,POST/PUT 等非幂等方法需额外加
non_idempotent参数才允许重试(Nginx 1.9.13+),否则会被拒绝










