Apache集群网关实现健康检查与故障转移需启用proxy_module、proxy_http_module、proxy_balancer_module和lbmethod_byrequests四大模块,配置BalancerMember的ping/retry参数,并透传X-Forwarded头以确保后端正确响应探针。
apache 集群网关要同时启用健康检查与故障转移,关键不是堆砌模块,而是让 健康状态可感知、可决策、可执行。apache 本身不内置“自动故障转移”逻辑,它依赖 mod_proxy_balancer 的负载均衡器根据节点健康状态动态调整流量分发——这本身就是一种轻量但可靠的故障转移机制。
启用核心模块并确认运行状态
缺一不可的四个模块必须启用并验证加载成功:
- proxy_module:代理基础引擎,所有转发依赖它
- proxy_http_module:支持 HTTP/HTTPS 后端通信,否则无法透传头或处理响应
- proxy_balancer_module:提供负载均衡能力,是故障转移的前提
-
lbmethod_byrequests(或
bytraffic/heartbeat):调度算法模块,决定如何轮询或加权分发请求
验证方式:执行 httpd -M | grep proxy,确保四者均在输出中显示为 shared。
定义带健康检查的负载均衡集群
在 <Proxy balancer://mycluster> 块中配置 主动探测 + 状态反馈,这是实现“自动绕过故障节点”的核心:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 用
BalancerMember指定每个后端地址,并附加status=+H(禁用)、status=+D(禁用且不参与探活)等标记,初始可留空 - 添加
ping=5参数(单位秒),让 Apache 在转发前先发 HEAD 请求探测连通性与基本响应 - 设置
retry=60(单位秒),表示节点被标记为失败后,60 秒内不再尝试,到期自动重试 - 搭配
loadfactor=1或自定义权重,便于后续扩容时平滑过渡
示例片段:
<Proxy balancer://mycluster>BalancerMember http://web1:8080 loadfactor=1 ping=5 retry=60
BalancerMember http://web2:8080 loadfactor=1 ping=5 retry=60
ProxySet lbmethod=byrequests
</Proxy>
透传真实客户端信息并保障后端可判断
健康检查有效,前提是后端服务能识别请求来源并返回有意义的响应。Apache 必须透传关键头,否则后端无法区分探针与真实流量,也无法记录真实 IP:
- 启用
headers_module,并在虚拟主机或代理块中加入:RequestHeader set X-Forwarded-Proto "expr=%{REQUEST_SCHEME}"RequestHeader set X-Forwarded-For "expr=%{REMOTE_ADDR}"RequestHeader set X-Forwarded-Host "expr=%{HTTP_HOST}" - 确保后端服务的
/health(或类似路径)接口返回200 OK,且不依赖 session 或认证——探针是匿名、无 Cookie 的 - 若后端需校验
X-Forwarded-Proto才返回健康响应,漏传该头会导致所有节点被误判为不健康
验证故障转移是否真正生效
光配对不验证等于没做。建议按顺序实测以下场景:
- 手动停掉
web1,持续 curl 网关地址 10 次,确认全部落到web2,且无 503 错误 - 重启
web1,等待至少retry秒后,再发请求,观察流量是否逐步回归(可用curl -I查看X-Balancer-Name响应头) - 查看 Apache error_log,搜索
proxy_balancer关键字,应出现类似member http://web1:8080 has been marked as failed和recovered日志 - 注意:Apache 默认不会因全节点失败而返回 503,而是继续尝试(符合高可用设计原则),如需兜底行为,需配合
mod_rewrite或外部 Keepalived 实现

















