Apache通过mod_proxy与mod_proxy_balancer将VirtualHost请求反向代理至Tomcat集群,实现负载均衡与会话保持;需配置BalancerMember、ProxyPass/ProxyPassReverse,并同步设置Tomcat的jvmRoute和Connector参数。

VirtualHost 与 ProxyPass 配合反向代理到 Tomcat 集群的核心逻辑
Apache 本身不处理 Java 应用,但可通过 mod_proxy 和 mod_proxy_balancer 模块,把 HTTP 请求转发给后端 Tomcat 集群,并对外统一暴露一个域名或路径。关键不是“每个 VirtualHost 绑定一个 Tomcat”,而是让 Apache 作为入口网关,把流量按策略分发到多个 Tomcat 实例。
前置准备:启用必要模块并确认配置基础
确保以下模块已加载(在 httpd.conf 或 mods-enabled 中检查):
- mod_proxy — 启用代理功能
- mod_proxy_http — 支持 HTTP 协议转发
- mod_proxy_balancer — 提供负载均衡能力(用于集群)
- mod_rewrite(可选)— 用于路径重写或跳转控制
若使用的是 CentOS/RHEL 系统,可用命令确认:httpd -M | grep proxy;Ubuntu/Debian 下对应为 a2enmod proxy proxy_http proxy_balancer,然后重启服务。
配置示例:基于域名的 VirtualHost + Tomcat 集群反向代理
在 httpd-vhosts.conf 或主配置中添加如下结构(以 app.example.com 为例):
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
<VirtualHost *:80>
ServerName app.example.com
ServerAdmin admin@example.com
<pre class='brush:php;toolbar:false;'># 启用代理请求头透传(重要!否则 Tomcat 获取不到真实 IP 和协议)
ProxyPreserveHost On
ProxyRequests Off
# 定义后端 Tomcat 集群(BalancerMember 可多个)
<Proxy "balancer://tomcat-cluster">
BalancerMember http://192.168.1.10:8080 route=tc1 retry=60
BalancerMember http://192.168.1.11:8080 route=tc2 retry=60
ProxySet lbmethod=byrequests
</Proxy>
# 将所有请求代理到集群
ProxyPass "/" "balancer://tomcat-cluster/"
ProxyPassReverse "/" "balancer://tomcat-cluster/"
# 日志便于排查(可选)
ErrorLog "/var/log/httpd/app_error.log"
CustomLog "/var/log/httpd/app_access.log" combined</VirtualHost>
说明:
-
route=tc1/tc2 需与 Tomcat 的 server.xml 中
jvmRoute="tc1"对应,实现 sticky session(会话保持) -
lbmethod=byrequests 表示按请求数轮询;也可用
bytraffic或bybusyness - ProxyPassReverse 必须配置,否则 Tomcat 返回的重定向响应(如 302)里的 Location 头仍含内部地址,导致浏览器跳转失败
Tomcat 端需同步调整的关键项
仅 Apache 配置不够,Tomcat 必须配合才能正确识别请求来源和维持会话:
- 在 $CATALINA_HOME/conf/server.xml 的
<Engine>标签中添加jvmRoute="tc1"(每台实例值不同) - 确保各 Tomcat 的
<Connector port="8080">开放且未限制访问 IP - 若应用依赖
request.getScheme()或request.isSecure(),需在 Connector 中加上:proxyPort="443" scheme="https" secure="true"(HTTPS 场景),或proxyPort="80" scheme="http"(HTTP 场景) - Web 应用的 WEB-INF/web.xml 中建议启用 session 配置:
<distributable/>(支持集群 session 复制,非必须但推荐)

















