apache反向代理负载均衡tomcat需启用mod_proxy、mod_proxy_balancer、mod_proxy_ajp等模块,配置balancer://集群组并指定ajp协议连接,通过proxypass绑定域名路径,设置stickysession实现会话粘滞,并在tomcat端启用ajp connector及匹配jvmroute。

Apache 本身不处理 Java Web 应用,但它可以作为前端反向代理,把 HTTP 请求按策略分发给后端多台 Tomcat 实例。核心是启用 mod_proxy 及其扩展模块,再通过 balancer:// 定义集群组,最后用 ProxyPass 将流量导向该组。
启用必要模块
打开 Apache 的 conf/httpd.conf,取消以下几行的注释(确保模块已存在):
LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_balancer_module modules/mod_proxy_balancer.soLoadModule proxy_ajp_module modules/mod_proxy_ajp.soLoadModule proxy_http_module modules/mod_proxy_http.so
注意:mod_proxy_ajp 更推荐用于 Tomcat(AJP 协议比 HTTP 更高效),若用 HTTP 方式则启用 proxy_http;两者不冲突,可同时启用。
配置负载均衡集群组
在 httpd.conf 末尾或 conf/extra/httpd-vhosts.conf 中添加如下结构:
<proxy balancer:>
BalancerMember ajp://127.0.0.1:8009 route=tomcat1 loadfactor=1
BalancerMember ajp://127.0.0.1:9009 route=tomcat2 loadfactor=1
ProxySet lbmethod=byrequests
</proxy>
说明:
-
ajp://表示使用 AJP 协议连接 Tomcat(需确保 Tomcat 的server.xml中 AJP Connector 已启用且端口不冲突) -
route值必须与对应 Tomcat 的jvmRoute配置一致(用于后续 session 粘滞) -
loadfactor控制权重,比如设为2和1即按 2:1 分配请求 -
lbmethod可选byrequests(默认)、bytraffic或bybusyness
绑定域名或路径并启用反向代理
添加虚拟主机或直接在主配置中设置代理规则:
<virtualhost>
ServerName example.com
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / balancer://mycluster/ stickysession=JSESSIONID|jsessionid nofailover=On
ProxyPassReverse / balancer://mycluster/
</virtualhost>
关键点:
-
ProxyRequests Off关闭正向代理,仅保留反向代理能力 -
stickysession=JSESSIONID|jsessionid启用会话粘滞,让同一用户后续请求始终落到同一台 Tomcat(依赖 Tomcat 的jvmRoute和 session cookie 名) -
nofailover=On表示即使某台 Tomcat 故障,也不将已有 session 切换到其他节点(避免丢失登录态)
Tomcat 端配合配置
每台 Tomcat 需做两处修改(以 conf/server.xml 为例):
- 确认 AJP Connector 存在且未被注释,如:
<connector port="8009" protocol="AJP/1.3" redirectport="8443"></connector> - 在
<engine></engine>标签中添加jvmRoute,值须与BalancerMember route=xxx一致:<engine name="Catalina" defaulthost="localhost" jvmroute="tomcat1"></engine>
若跨机器部署,还需检查防火墙是否放行 AJP 端口(默认 8009),并确认 Tomcat 的 remoteAddr 或 allow 属性允许 Apache 所在 IP 访问。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











