apache反向代理本身无高可用能力,必须配合mod_proxy_balancer实现负载均衡与健康检查,并通过keepalived+vip等外部机制保障代理层自身ha;缺一不可的模块包括proxy、proxy_http和proxy_balancer。

Apache 反向代理本身不自带高可用(HA)能力,必须配合负载均衡器、健康检查、故障自动剔除和外部故障转移机制才能构成真正高可用集群。核心不是“单台 Apache 多配几个后端”,而是让整个代理层无单点、可自愈、可切换。
必须启用的模块缺一不可
仅加载 mod_proxy 和 mod_proxy_http 不足以支撑集群——mod_proxy_balancer 是实现节点调度与状态管理的底层依赖。缺少它,BalancerMember、ProxySet 等指令会报错:Invalid command 'BalancerMember'。
启用方式按系统区分:
- Debian/Ubuntu:
a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests - RHEL/CentOS:编辑
/etc/httpd/conf.modules.d/00-proxy.conf,取消以下三行注释:LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_http_module modules/mod_proxy_http.soLoadModule proxy_balancer_module modules/mod_proxy_balancer.so
重启 Apache 后用 httpd -M | grep proxy 验证是否全部生效。
负载均衡器定义与健康检查配置
使用 balancer:// 协议定义集群,每个 BalancerMember 必须显式设置关键参数:
-
route:用于粘性会话,需与后端应用(如 Tomcat 的
jvmRoute或自定义 Cookie 名)严格一致 - status=+H:初始即标记为“禁用”,避免启动时未就绪就被打量请求
- ping=5:每 5 秒向后端发 HEAD 请求探测存活(要求后端能响应 2xx)
- failonstatus=500,502,503,504:返回这些状态码即触发故障标记
- retry=60:故障后 60 秒再尝试恢复连接,避免雪崩重试
示例片段:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<proxy balancer:>
BalancerMember http://192.168.1.10:8080 route=node1 ping=5 failonstatus=500,502,503,504 retry=60 status=+H
BalancerMember http://192.168.1.11:8080 route=node2 ping=5 failonstatus=500,502,503,504 retry=60 status=+H
ProxySet lbmethod=bybusyness stickysession=JSESSIONID|jsessionid
</proxy>
ProxyPass 与 ProxyPassReverse 必须成对出现
ProxyPass 负责请求转发,但若后端返回 302 重定向或带绝对路径的 Location 头,默认会暴露内网地址,导致浏览器直连失败。此时 ProxyPassReverse 会自动重写响应头中的 URL,使其仍经由代理出口。
常见错误配置:
- 只写
ProxyPass /api/ http://backend/,漏掉ProxyPassReverse -
ProxyPass末尾有/,而ProxyPassReverse没有,造成路径映射错位
正确写法示例:
ProxyPass /api/ http://192.168.1.10:8080/api/ ProxyPassReverse /api/ http://192.168.1.10:8080/api/
若用 balancer,则统一指向集群名:
ProxyPass /api/ balancer://myapp/ ProxyPassReverse /api/ balancer://myapp/
代理层自身高可用需外部组件支持
单台 Apache 仍是单点。要实现整层 HA,必须引入第二层冗余:
- Keepalived + VIP:两台 Apache 均部署相同配置,通过 Keepalived 绑定浮动 IP,主挂则备自动接管
- DNS 轮询 + 健康探测:前端用多个 A 记录指向不同 Apache,配合外部监控(如 Zabbix)动态修改 DNS TTL 或屏蔽异常节点
- 前置 LVS/Nginx:在 Apache 前再加一层四层或七层负载均衡器,Apache 仅作应用网关角色
不建议依赖 Apache 自身的 nofailover=On 或 failonstatus 实现“代理层 HA”——它们只管后端,不管自己挂了怎么办。









