fail_timeout是节点标记为down后的静默期长度,决定统计窗口与试探恢复时机;需按后端类型设定合理值,并与proxy_connect_timeout、proxy_read_timeout、proxy_next_upstream协同调优,配合主动健康检查加速恢复。

fail_timeout 不是“故障等待时间”的字面意思,而是节点被标记为不可用后的静默期长度,它和 max_fails 共同决定节点何时下线、何时试探恢复。设错会导致节点反复上下线,或修复后长期不回流。
fail_timeout 的真实作用机制
它定义两个关键行为:
- 统计窗口:在连续 fail_timeout 秒内,若该节点失败次数 ≥ max_fails,即被标记为 down
- 静默期:标记为 down 后,Nginx 接下来 fail_timeout 秒内完全不发任何请求给它
- 试探恢复:期满后,仅靠第一个真实业务请求去试探——成功则立即恢复,失败则重置计时、再等一个 fail_timeout
按后端类型设定合理值
不能统一写成 10s 或 30s,要匹配实际恢复节奏:
- 同机房 Web/API(RT 100–300ms):fail_timeout=30s,max_fails=3
- 跨机房或弱网络链路(丢包/延迟波动常见):fail_timeout=60s,max_fails=5
- 慢响应服务(报表、大文件上传,单次耗时 40–60s):fail_timeout=90s~120s,max_fails=2
- 强实时接口(支付、风控回调):fail_timeout=5s,max_fails=1,但必须有幂等与客户端重试兜底
- 缓存类后端(Redis/Memcached,毫秒级):fail_timeout=10s,max_fails=2
必须同步调优的配套参数
单独改 fail_timeout 几乎无效,以下三项必须对齐:
- proxy_connect_timeout 必须小于 fail_timeout:例如 fail_timeout=30s,则 connect_timeout ≤10s(内网)或 ≤15s(跨可用区),否则建连卡住,整个周期白白浪费
- proxy_read_timeout 建议设为 fail_timeout 的 1/3~1/2:确保读超时能及时上报失败,不拖慢计数更新
-
proxy_next_upstream 必须显式启用判定项:如
error timeout http_502 http_504,否则默认只认连接拒绝和建连超时,502 等错误不参与计数
叠加主动健康检查加速恢复
纯被动机制依赖真实流量试探,恢复慢且滞后。建议补充:
- 使用
health_check(OpenResty)或nginx_upstream_check_module(开源版) - 检查间隔设为
proxy_connect_timeout × 1.5左右(如 connect_timeout=10s,则 interval=15s) - 失败阈值 fall=2,恢复阈值 rise=3,避免单次探测抖动误判
- 主动检查成功后可立即恢复节点,不再等待 fail_timeout 到期











