apache mod_proxy负载均衡需组合mod_proxy、mod_proxy_http、mod_proxy_balancer、调度算法模块(如lbmethod_byrequests)及mod_slotmem_shm共同工作,缺一不可;须用定义集群、proxyset指定算法、balancermember配置后端节点,并通过proxypass/proxypassreverse实现路径映射与响应头修正。
apache 用 mod_proxy 实现负载均衡,本质是组合多个模块协同工作:不是单靠一个模块开箱即用,而是靠 mod_proxy + mod_proxy_http + mod_proxy_balancer + 调度算法模块(如 mod_lbmethod_byrequests)+ 共享内存模块(mod_slotmem_shm)共同完成。
确认并启用必需模块
缺一不可,否则集群无法启动或管理界面打不开:
-
mod_proxy:提供基础代理能力 -
mod_proxy_http:转发 HTTP 请求到后端(如 Tomcat、Node.js) -
mod_proxy_balancer:实现集群定义、状态跟踪与请求调度框架 -
mod_lbmethod_byrequests(或bytraffic/bybusyness):指定分发算法 -
mod_slotmem_shm:必需!用于进程间共享集群状态,缺失会导致/balancer-manager报错或空白
验证命令:
httpd -M | grep -E 'proxy|lbmethod|slotmem'
Ubuntu/Debian 可运行:
a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests slotmem_shm
RHEL/CentOS 检查 /etc/httpd/conf.modules.d/00-proxy.conf 中对应 LoadModule 行未被注释。
定义 balancer 集群(核心步骤)
集群必须用 <proxy></proxy> 块明确定义,命名格式为 balancer://xxx。所有节点、权重、算法都写在这里:
- 每个
BalancerMember指定一个后端地址,支持参数:loadfactor=2(相对权重)、status=+H(热备,仅当其他全宕时启用)、ping=5(每5秒主动探测健康)、retry=60(故障后60秒再尝试恢复) -
ProxySet必须放在之前,作用于整个集群:lbmethod=byrequests(轮询,默认)lbmethod=bytraffic(按响应字节数)timeout=10(等待后端响应上限)
示例配置(可放主配置文件或 <virtualhost></virtualhost> 内):
<proxy balancer:>
BalancerMember http://192.168.1.10:8080 loadfactor=3 ping=5 retry=60
BalancerMember http://192.168.1.11:8080 loadfactor=2 ping=5 retry=60
BalancerMember http://192.168.1.12:8080 status=+H
ProxySet lbmethod=byrequests timeout=10
</proxy>
绑定路径并完成转发
仅定义集群不转发请求。需用 ProxyPass 将 URL 路径映射到集群:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
ProxyPass "/app/" "balancer://api/"→ 把/app/hello改写为/hello发往后端 -
ProxyPassReverse "/app/" "balancer://api/"→ 修正后端返回的Location、Set-Cookie等响应头,避免重定向跳转错误 - 若需会话保持(如 JSESSIONID),加参数:
stickysession=JSESSIONID或route=node1(配合 Tomcat 的jvmRoute)
常见写法:
ProxyPass "/api/" "balancer://api/" ProxyPassReverse "/api/" "balancer://api/"
启用 balancer-manager 管理界面
这不是集群本身,而是运维用的 Web 控制台,用于实时查看、启停节点、切换算法:
- 必须配置
<location></location>并启用SetHandler balancer-manager - 生产环境务必限制访问来源:
Require ip 192.168.1.100或Require host example.com - 不要写
Require all granted—— 这等于把集群控制权暴露给公网
配置片段:
<location>
SetHandler balancer-manager
Require ip 127.0.0.1
Require ip 192.168.1.0/24
</location>
重启 Apache 后,访问 http://your-server/balancer-manager 即可看到实时状态面板。









