Apache通过mod_proxy_balancer实现请求级动态故障转移,核心是配置failonstatus、retry、timeout、maxattempts及ping参数,结合健康检查与/balancer-manager管理界面,自动摘除异常节点并探测恢复。

Apache 本身不内置故障转移逻辑,但可以通过 mod_proxy_balancer 搭配合理参数,实现后端节点失效时自动切换到可用节点——这不是“主备抢占式切换”,而是请求级的动态故障摘除与恢复。
启用必要模块并定义负载均衡集群
确保以下模块已加载(以 CentOS/RHEL 为例):
-
mod_proxy、mod_proxy_http -
mod_proxy_balancer(核心) -
mod_lbmethod_byrequests或其它调度算法模块 -
mod_slotmem_shm(共享内存支持,必须)
在 <VirtualHost> 或主配置中定义集群:
<Proxy balancer://myapp>
BalancerMember http://192.168.1.10:8080 loadfactor=1
BalancerMember http://192.168.1.11:8080 loadfactor=1 status=+D
ProxySet lbmethod=byrequests
</Proxy>
ProxyPass / balancer://myapp/
ProxyPassReverse / balancer://myapp/
其中 status=+D 表示初始禁用该节点,可手动启用;也可留空让所有节点默认参与。
配置故障识别与自动隔离
关键靠 failonstatus + retry 组合实现闭环容错:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
failonstatus=500,502,503,504:网关类错误立即标记为失败 -
failonstatus=429:配合限流策略主动下线过载节点 -
retry=30:节点被标记失败后,30 秒再尝试发请求探测是否恢复 -
timeout=10:单次代理请求超时,避免阻塞连接池 -
maxattempts=2:单个请求最多转发 2 次(含重试),防雪崩
完整示例:
<Proxy balancer://myapp>
BalancerMember http://192.168.1.10:8080 failonstatus=500-599 retry=30 timeout=10 maxattempts=2
BalancerMember http://192.168.1.11:8080 failonstatus=500-599 retry=30 timeout=10 maxattempts=2
ProxySet lbmethod=byrequests
</Proxy>
补充健康检查增强可靠性
仅靠 HTTP 状态码不够,建议后端提供轻量健康接口(如 /health),并在 Apache 中通过 ping 参数主动探测:
-
ping=5:每 5 秒向后端发一次 HEAD 请求检查存活 -
ping=5-200:5 秒超时,要求返回 200 才视为健康(需后端支持) - 注意:
ping是对后端 TCP 连通性 + 基础响应的探测,比failonstatus更底层
示例:
BalancerMember http://192.168.1.10:8080 ping=5-200 failonstatus=500-599
验证与管理入口
开启 mod_status 并配置管理界面,实时查看节点状态:
<Location "/balancer-manager">
SetHandler balancer-manager
Require local
</Location>
访问 http://your-apache/balancer-manager 可看到每个成员的“状态”(OK / ERR / DIS)和“失败次数”,支持手动启用/禁用节点,便于应急干预。

















