nginx默认不自动重试失败请求,需显式配置proxy_next_upstream等参数并依赖多节点upstream实现容错;仅对error、timeout及5xx错误触发重试,限制tries和timeout防雪崩,配合被动健康检查与合理超时设置提升可靠性。

Nginx 默认不自动重试失败请求,必须显式配置才能启用重试机制。核心在于合理组合 proxy_next_upstream 及其配套参数,并依托 upstream 多节点结构实现容错。
明确哪些失败会触发重试
Nginx 仅在满足 proxy_next_upstream 指定条件时才转向下一个上游服务器。常见且实用的触发条件包括:
-
error:连接建立、发请求或读响应头时发生网络错误(如后端宕机) -
timeout:连接超时(proxy_connect_timeout)或读响应头超时(proxy_read_timeout) -
http_500、http_502、http_503、http_504:典型网关级错误,适合重试 - 避免加入
http_404、http_403等业务类状态码——重试无意义,还可能放大问题
限制重试行为,防止雪崩
光定义触发条件不够,必须用两个参数控制总量和耗时:
-
proxy_next_upstream_tries 3:最多尝试 3 次(首次 + 最多 2 次重试),避免无限转发 -
proxy_next_upstream_timeout 6s:从第一次请求开始计时,整个重试过程总耗时上限为 6 秒;超时即返回 502,不继续等待
注意:这两个参数作用于“整套重试流程”,不是单次请求超时。单次超时由 proxy_connect_timeout、proxy_send_timeout、proxy_read_timeout 分别控制。
配置多节点 upstream 并启用被动健康检查
重试的前提是有多个可用后端。upstream 块需至少定义两台服务器,并启用故障自动屏蔽:
-
max_fails=2:连续失败 2 次后标记该节点为不可用 -
fail_timeout=30s:30 秒内不再将新请求分发给该节点 - 可选加
backup:作为兜底节点,仅当其他全不可用时启用
这样,Nginx 在重试时会跳过已标记为 down 的节点,提升成功率。
针对慢响应的特殊处理
后端长时间处理但最终返回 200,Nginx 默认不重试。若想对“慢”也重试,关键是把慢转化为 timeout:
- 缩短
proxy_read_timeout 5s:要求后端在 5 秒内返回响应头;超时即触发timeout条件,进入重试流程 - 配合
proxy_next_upstream error timeout ...,即可让卡在数据库查询、锁等待等场景的请求自动切到其他实例
慎用非幂等请求重试
GET/HEAD 天然可重试;POST/PUT/DELETE 等非幂等方法默认不重试。除非确认后端完全幂等,否则不要加 non_idempotent —— 否则可能造成重复下单、重复扣款等严重后果。
不复杂但容易忽略











