apache mod_proxy_balancer 通过启用 mod_proxy、mod_proxy_balancer、mod_proxy_ajp(或 mod_proxy_http)模块,配置 balancer:// 集群、balancermember 指定带 route 的 tomcat 节点,结合 proxyset lbmethod 和 stickysession=jsessionid 实现基于 ajp 的负载均衡与会话粘性。
apache 的 mod_proxy_balancer 模块配合 tomcat 实现负载均衡,核心是让 apache 充当反向代理,把 http 请求按策略分发到多个 tomcat 实例。整个过程不依赖额外插件(如 mod_jk),利用 apache 2.2+ 内置模块即可完成,配置清晰、维护简单。
启用必要模块
确保 Apache 加载了以下关键模块(在 httpd.conf 中取消注释):
-
mod_proxy.so:提供基础代理能力 -
mod_proxy_balancer.so:支持负载均衡逻辑 -
mod_proxy_ajp.so(推荐)或mod_proxy_http.so:与 Tomcat 通信的协议模块
AJP 协议比 HTTP 更高效,适合内网场景;若 Tomcat 已启用 HTTP Connector(如 8080 端口),也可用 proxy_http,但需确保 Tomcat 的 HTTP 连接器已开启且可访问。
配置 Tomcat 多实例并统一标识
至少准备两个 Tomcat 实例,确保端口不冲突(尤其是 AJP 端口,默认 8009):
- Tomcat A:AJP 端口设为
8009,在server.xml的<engine></engine>标签中添加jvmRoute="tomcat1" - Tomcat B:AJP 端口改为
8010(或其他未占用端口),对应设置jvmRoute="tomcat2"
jvmRoute 值必须与后续 BalancerMember 的 route= 参数一致,这是实现粘性会话(session stickiness)的关键依据。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
定义负载均衡组和代理规则
在 httpd.conf 或独立配置文件(如 extra/httpd-vhosts.conf)中添加如下配置:
ProxyRequests Off
<proxy balancer:>
BalancerMember ajp://localhost:8009 route=tomcat1 loadfactor=1
BalancerMember ajp://localhost:8010 route=tomcat2 loadfactor=1
ProxySet lbmethod=byrequests
</proxy><virtualhost>
ServerName example.com
ProxyPass / balancer://mycluster/ stickysession=JSESSIONID|jsessionid
ProxyPassReverse / balancer://mycluster/
</virtualhost>
说明:
-
stickysession=JSESSIONID|jsessionid启用会话粘性,确保同一用户后续请求落到同一台 Tomcat -
lbmethod=byrequests表示按请求数轮询分配;也可选bytraffic(按流量)或bybusyness(按当前活跃连接数) -
loadfactor控制权重,比如设为2和1,表示第一台承担约 2/3 的请求
验证与可选增强
重启 Apache 和所有 Tomcat 实例后,可通过以下方式确认生效:
- 访问
http://your-apache-server/balancer-manager(需提前配置balancer-managerLocation 并授权)查看实时节点状态、请求计数和权重分配 - 在应用中打印
request.getSession().getId(),观察 JSESSIONID 是否带路由标识(如ABC123.tomcat1),确认粘性生效 - 停掉一台 Tomcat,观察请求是否自动切到另一台(
nofailover=Off默认行为)
如需 session 共享而非仅粘性,还需在 Tomcat 的 server.xml 中启用 <cluster></cluster> 配置,并开放组播或使用静态成员列表。










