nginx 默认不重试空响应,需配置 proxy_next_upstream error 才能触发轮询切换;必须在 location 块中设置,配合 upstream 多节点与健康检查(max_fails=2 fail_timeout=10s),并限制重试次数(tries=3)和总超时(timeout=12s)。

后端返回空响应(比如连接建立成功但没发任何数据、响应体为空且无状态行)时,Nginx 默认不会重试——它会把这种“半截响应”当作错误,但是否触发轮询切换,取决于你有没有显式配置 proxy_next_upstream 并包含 error 条件。
空响应属于 error 类型,必须开启 proxy_next_upstream error
Nginx 将以下情况统一归为 error:TCP 连接被拒、连接中断、收到不完整或非法 HTTP 响应(如空响应、只有部分 header、无 status line)。这类问题无法生成标准 HTTP 状态码,所以不能靠 http_502 等触发重试,只能依赖 error。
- 必须在
location块中配置:proxy_next_upstream error; - 仅写在
http或server顶层不生效,必须作用于具体代理路径 - 建议组合常用项:
proxy_next_upstream error timeout http_502 http_503;,覆盖更广的失败场景
确保 upstream 至少有两个可用节点,并启用被动健康检查
只有一台后端时,即使配置了重试,也没“下一个”可切。同时,若某节点持续返回空响应,Nginx 需能自动标记它为临时不可用,避免反复试探加重故障。
- upstream 中至少定义两个
server,例如:server 10.0.1.10:8080;和server 10.0.1.11:8080; - 为每个 server 加上健康参数:
max_fails=2 fail_timeout=10s; - 这样连续 2 次因
error失败后,该节点会被隔离 10 秒,期间请求直接跳过
控制重试边界,防止雪崩或长等待
空响应往往伴随连接卡顿或进程僵死,单次超时设置不合理会导致重试耗时过长,甚至拖垮整个请求链路。
-
proxy_connect_timeout 3s;:建连阶段超时,快速失败 -
proxy_read_timeout 8s;:读取响应头/体的总时间,空响应通常在此阶段卡住 -
proxy_next_upstream_tries 3;:最多尝试 3 台(含首次),避免无限轮转 -
proxy_next_upstream_timeout 12s;:所有重试加起来不能超过 12 秒,超时即返回 502
验证空响应是否真被识别为 error
可通过日志确认 Nginx 是否按预期处理:开启 error_log /var/log/nginx/error.log debug;(临时),观察是否有类似 upstream prematurely closed connection while reading response header from upstream 的记录——这就是空响应的典型 debug 日志,说明已命中 error 分支。
- 也可用
curl -v http://nginx-ip/path手动模拟,配合后端故意关闭连接或不写响应来复现 - 注意:不要依赖
if或try_files在 location 内做逻辑判断,Nginx 不支持运行时切换 proxy_pass











