mod_proxy_balancer模块是实现带权重和健康检查的负载均衡所必需的;需通过httpd -M验证其启用,并在Proxy块中配置BalancerMember、status=+H及ProxyHCExpr等指令。

mod_proxy 本身不提供负载均衡算法,必须搭配 mod_proxy_balancer 才能实现带权重、健康检查的请求分发;单独启用 mod_proxy 只能做反向代理,不是真负载均衡。
如何确认 mod_proxy 和 mod_proxy_balancer 已启用
Apache 2.4 默认不启用 mod_proxy_balancer,仅 mod_proxy 可能已加载。用以下命令验证:
httpd -M | grep proxy
正确输出应包含:
proxy_module (shared) proxy_http_module (shared) proxy_balancer_module (shared)
若缺失 proxy_balancer_module,需在配置中显式加载:
- Ubuntu/Debian:取消
/etc/apache2/mods-enabled/proxy_balancer.load的注释,或运行a2enmod proxy_balancer - RHEL/CentOS:在
/etc/httpd/conf.modules.d/00-proxy.conf中确保有LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
如何写一个带健康检查和权重的 balancer 配置
关键点在于 块内定义后端节点,并用 status=+H 开启主动健康检查(H 表示 “heartbeat”),loadfactor 控制权重。
示例配置片段(放在 VirtualHost 或主配置中):
<proxy>
BalancerMember http://192.168.1.10:8080 loadfactor=3 status=+H
BalancerMember http://192.168.1.11:8080 loadfactor=1 status=+H
ProxySet lbmethod=bytraffic
</proxy>
ProxyPass "/api/" "balancer://mycluster/"
ProxyPassReverse "/api/" "balancer://mycluster/"
注意:
-
lbmethod可选值:byrequests(默认)、bytraffic、bybusyness;生产环境推荐bybusyness,它会优先转发给当前请求数少的节点 -
status=+H必须配合ProxyHCExpr和ProxyHCTemplate才能真正生效健康检查,否则只是标记,不探测 - 若后端服务监听 Unix socket(如
unix:/var/run/app.sock|http://localhost/),路径必须用竖线分隔,且 Apache 进程需有 socket 文件读写权限
为什么 /balancer-manager 页面打不开或提示 403
balancer-manager 是内置 CGI 管理界面,但默认被禁止访问,需手动放行并限制来源。
常见错误配置:
- 只加了
Require local,但你从远程访问 → 改成Require ip 192.168.1.0/24或具体 IP - 没启用
mod_status→balancer-manager依赖它,必须同时启用mod_status - 路径拼错:必须是
Location "/balancer-manager",不是/manager或/proxy-balancer
最小可用配置:
<location>
SetHandler balancer-manager
Require ip 10.0.0.0/8
</location>
访问 http://your-domain/balancer-manager 后,能看到实时节点状态、手动下线/上线、调整权重等操作入口。
真正麻烦的是健康检查的响应判定逻辑——ProxyHCExpr 的正则匹配容易写错,且失败时不会报明显错误,只会让节点“静默掉线”。建议先用 curl -v 模拟探测路径,再对照 ProxyHCExpr 的匹配规则调试。









