Apache不重试同一节点,而是通过lbmethod=byrequests/bytraffic、maxattempts=2和nofailover=Off实现故障转移;failonstatus=500-599、timeout=5、retry=15用于识别隔离坏节点;2.4.33+可配ping=5,HEAD,/health主动探测;全宕时默认返回503,可Rewrite至维护页。

Apache 本身不自动“重试同一节点”,而是靠换节点来实现故障转移。关键不是让请求反复打向坏机器,而是快速识别失效、跳过它、转给健康的节点,并在必要时提供兜底响应。
确保负载算法支持换节点
必须用支持多尝试的调度方式,否则 maxattempts 不生效:
- lbmethod=byrequests 或 lbmethod=bytraffic:这两个算法允许失败后选下一个 worker;bybusyness 已废弃,不要用
- maxattempts=2:表示最多尝试 2 个不同后端;设为 1 就等于不转移
- nofailover=Off:显式开启故障转移(默认是开的,但写上更稳妥)
主动识别并隔离坏节点
不能只等连接断开,要覆盖常见业务失败场景:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- failonstatus=500-599:收到任意 5xx 响应,立刻把该节点标记为失效,进入冷却期
- timeout=5:单次请求代理等待上限设为 5 秒,超时即放弃当前节点,触发 maxattempts 换人
- retry=15:节点被标记失效后,15 秒内不参与新请求分发;值建议略大于后端健康检查周期(如 5s 周期,设 15 合理)
预防“假活”节点(可选但推荐)
有些后端卡死但 TCP 连接没断,proxy 不会感知。Apache 2.4.33+ 可启用前置探测:
- 启用模块:a2enmod proxy_hcheck(Debian/Ubuntu)或确认 LoadModule 已加载
- 配置 ping 探测:ping=5,HEAD,/health:每 5 秒对 /health 发 HEAD 请求
- 配合 ping_timeout=2:2 秒无响应就本次跳过,不计入 retry,只影响当次调度
全部后端都不可用时返回友好页面
当所有节点都在 retry 期内或全被标记为 DOWN,mod_proxy_balancer 默认返回 503。可用 mod_rewrite 拦截并展示静态兜底页:
- 在
<Location>或虚拟主机中添加: - RewriteCond %{REQUEST_STATUS} ^503$
- RewriteRule ^(.*)$ /maintenance.html [R=503,L]
- 确保
/maintenance.html存在 DocumentRoot 下,且不经过代理

















