Apache故障转移依赖mod_proxy_balancer实现,非原生集群;重试由maxattempts控制节点轮询次数,retry设定故障隔离时间;超时分ProxyTimeout、BalancerMember timeout等三级,需分别配置;推荐结合mod_proxy_hcheck主动健康检查提升可靠性。
apache 故障转移(failover)本身不是 apache http server 原生内置的“高可用集群”机制,而是通常通过反向代理模块(mod_proxy + mod_proxy_balancer)配合后端服务实现的。重试次数与超时门限的控制,关键在于代理层对后端节点的健康探测、请求转发策略和失败响应处理逻辑。
重试次数:由 ProxyPass 指令的 retry 和 maxattempts 控制
在 ProxyPass 中,可通过以下参数设定故障转移行为:
-
retry=:指定某个后端节点在失败后被标记为“不可用”的持续时间(单位:秒)。例如
retry=60表示该节点失败后 60 秒内不再被调度,期间所有请求会转向其他可用节点——这本质是“被动剔除+自动恢复”,不是传统意义上的“重试当前节点”。 -
maxattempts=(仅适用于
BalancerMember):定义单次请求最多尝试多少个后端节点(含首次),默认为 1。设为 3 表示:若第一个节点无响应,就换第二个;再失败,换第三个;全部失败才返回错误。注意:它不重试同一节点,而是轮询可用成员。 - 真正意义的“同节点重试”需结合
ProxySet或外部模块(如mod_proxy_hcheck)或应用层兜底,HTTPD 本身不支持对单个 backend 的多次连接重试。
超时门限:分三类独立配置,必须明确区分
Apache 代理链路中存在多个超时层级,混淆会导致故障转移失效:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- ProxyTimeout:全局指令,设置代理等待后端响应的总时间(即从发请求到收完响应体的上限),单位秒。若后端卡住不回包,到时直接断开并触发 failover。
- ProxyBadHeader 配合 ProxyErrorOverride 可影响错误响应处理,但不控制超时。
- 每个
BalancerMember可单独设置:
–timeout=:连接建立后,等待后端首行响应(status line)的最大时间;
–keepalive=:是否启用 HTTP keep-alive(影响复用,非超时);
–retry=:如前所述,是故障隔离窗口,不是超时值。
实际配置示例(推荐组合)
以下是一个典型生产级故障转移配置片段:
<Proxy "balancer://mycluster">
BalancerMember http://backend1:8080 loadfactor=1 timeout=5 retry=60
BalancerMember http://backend2:8080 loadfactor=1 timeout=5 retry=60
BalancerMember http://backup:8080 loadfactor=1 timeout=10 retry=300
</Proxy>
ProxyTimeout 15
ProxyPass "/api/" "balancer://mycluster/" maxattempts=2
ProxyPassReverse "/api/" "balancer://mycluster/"
说明:
– 后端主节点 timeout=5,表示只等 5 秒首行响应,快速失败;
– backup 节点 timeout 更长(10 秒),且 retry=300,作为兜底慢节点;
– ProxyTimeout 15 是最终兜底,防止整个请求挂死;
– maxattempts=2 确保最多试两个节点,避免全挂时长耗尽。
补充:健康检查增强可靠性
仅靠超时和 retry 不足以应对“假存活”(如进程僵死但端口仍通)。建议启用主动健康检查:
- 使用
mod_proxy_hcheck(Apache 2.4.43+)定期发 HEAD/GET 探针; - 配置
hcmethod=HEAD hcuri=/health hcinterval=10实现 10 秒一次心跳; - 失败连续 3 次自动踢出,恢复后自动加回,比单纯依赖超时更精准。

















