fail_timeout既是失败统计窗口长度,也是节点被标记为down后的跳过时长;它不控制熔断持续时间,而是决定节点从被摘除到首次试探恢复的时间间隔,需与max_fails、proxy_next_upstream等协同配置。

fail_timeout 不是“节点下线后等多久再试”,而是定义一个动态滑动的失败统计窗口,同时决定节点被跳过的时长。配得短,响应快但易误杀;配得长,稳定但恢复慢。关键在匹配你后端的真实响应节奏。
fail_timeout 的双重作用必须理解清楚
它既是「失败计数的时间范围」,也是「节点被标记为不可用的持续时间」:
- 在最近 fail_timeout 秒内,只要失败次数累计达到 max_fails,节点立即被标记 down
- 该节点随后会被跳过 exactly fail_timeout 秒——不是定时轮询恢复,而是靠第一个新请求来试探
- 若这次试探成功,节点自动回到可用池;失败则重置计时,继续隔离
- 默认值(10s)太敏感,生产环境必须显式覆盖,不能留空
按业务类型选对 fail_timeout 值
不能套用统一数字,要看单次请求典型耗时和错误容忍度:
- 高敏感低频接口(如支付回调、风控通知):设为 10s。单次失败就隔离,避免错误扩散,但需配套重试兜底
- 常规 Web/API 服务(QPS 数百~数千,RT 100–300ms):推荐 30s。能过滤 GC 暂停、瞬时抖动,是多数团队的稳健起点
- 高并发网关(QPS 万级+,节点少):建议 10s。缩短窗口,配合提高 max_fails(如 20),防止毛刺反复触发震荡
- 慢响应服务(报表导出、大文件上传,单次可能 40–90s):应设为 60s 或 90s。避免一次正常慢请求就被计入失败,导致健康节点被误摘
fail_timeout 必须和这些参数协同生效
单独调 fail_timeout 几乎没用,以下三项不匹配会直接失效:
- proxy_read_timeout 必须小于 fail_timeout:例如 fail_timeout=30s,proxy_read_timeout 建议设为 15–25s;否则请求卡在读阶段超时,无法及时触发失败计数
- proxy_next_upstream 必须显式启用关键状态码:默认只把连接拒绝、连接超时算失败;502/503/504 等必须手动加入,如:proxy_next_upstream error timeout http_500 http_502 http_503 http_504
- max_fails 必须成对调整:fail_timeout=60s 时还用 max_fails=1,等于一次慢请求就停机 60 秒;fail_timeout=10s 却设 max_fails=3,高 QPS 下极易频繁误剔
常见踩坑点提醒
这些操作会让 fail_timeout 失去意义或行为反直觉:
- 把 fail_timeout 设得比平均响应时间还短(比如接口平均要 8s,却设成 5s)→ 节点刚上线就被反复误判
- 忽略 proxy_connect_timeout 设置,导致连接阶段异常无法进入计数流程
- 设 fail_timeout=0 → 相当于禁用被动健康检查,节点永远不被自动摘除
- 依赖它发现“半死不活”状态(如进程存活但卡死)→ 它只能响应已返回的错误或超时,无法主动探测挂起










