nginx通过proxy_connect_timeout和proxy_read_timeout触发超时失败,结合max_fails与fail_timeout实现节点自动规避,并借助proxy_next_upstream重试机制保障请求不卡死,backup节点作为兜底通道。

Nginx 对超时未响应节点的自动规避,核心是把“超时”明确转化为健康检查失败事件,并触发两级响应:一是临时剔除该节点,二是让当前请求换节点重试。它不靠心跳探测,而是依赖代理过程中的真实超时行为来驱动容错。
proxy_read_timeout 和 proxy_connect_timeout 是触发前提
这两个参数决定了 Nginx 何时判定后端“没响应”。必须显式配置,不能依赖默认 60 秒:
-
proxy_connect_timeout控制建立 TCP 连接的等待上限,建议设为 3–5 秒(网络稳定时)或最多 8 秒(高延迟环境) -
proxy_read_timeout控制从后端读取响应体的最长等待时间,应略高于后端 P95 耗时(例如后端 P95 是 9 秒,这里设 12–15 秒) -
proxy_send_timeout一般与proxy_read_timeout保持一致,除非有特殊流式场景
只有在这两个超时实际发生时,Nginx 才会记录一次失败,进而参与 max_fails 统计。
max_fails + fail_timeout 实现节点自动规避
在 upstream 的 server 行中配置,让 Nginx 把连续超时当作“不可用信号”:
-
max_fails=2:连续 2 次超时(或 error/5xx)就标记该节点为 down -
fail_timeout=10s:该节点被跳过 10 秒;10 秒后首个新请求会试探性发过去,成功则恢复,失败则重置计时
这个机制是滑动窗口式的——不是固定从某时刻起倒计时 10 秒,而是在最近 10 秒内累计失败达阈值才触发。
proxy_next_upstream 让单次请求不卡死
光剔除节点还不够,用户请求不能等 10 秒才失败。需在 location 块中启用重试:
-
proxy_next_upstream error timeout:连接失败或超时都立即换下一个节点 - 可叠加
http_500 http_502 http_503 http_504,覆盖后端返回网关错误的场景 - 配合
proxy_next_upstream_tries 3限制最多尝试 3 台(含首试),避免雪崩 -
proxy_next_upstream_timeout 10s控制整轮重试总耗时不超限
注意:proxy_next_upstream 不影响节点长期状态,只决定本次请求是否转发给别的 server。
backup 节点作为兜底通道
当所有主节点因超时被标记为 down,流量会自动落到带 backup 标志的服务器上:
-
server 192.168.1.99:8080 backup max_fails=2 fail_timeout=20s; - backup 节点也受同样容错规则约束,防止它自己成为新的故障点
不复杂但容易忽略











