apache按域名分流请求至不同tomcat实例,核心是配置多个virtualhost并分别proxypass至各tomcat的独立ajp端口(如8009、8010),同时tomcat端需配置对应host及不重叠的ajp连接器。

要让 Apache 将不同域名的请求分别转发到不同的 Tomcat 实例,核心是“Apache 做反向代理 + 每个 Tomcat 实例独立监听(不同端口或不同 IP)+ 各自配置专属虚拟主机”。这不是靠 Apache 单独完成的,而是 Apache 与多个 Tomcat 协同分工的结果。
明确分工:Apache 负责路由,Tomcat 负责承载
Apache 不直接运行 Java 应用,它只负责接收 HTTP 请求,根据 Host 头(即访问的域名)判断该转给哪个后端 Tomcat。每个 Tomcat 实例需满足两个前提:
- 监听不同端口(如 8080、8088、8090),避免端口冲突
- 各自 server.xml 中定义专属的
,且 name 属性与实际要响应的域名严格一致(如 www.a.com、api.b.com)
Tomcat 端:为每个实例配置独立虚拟主机
以两个实例为例(tomcat-a 和 tomcat-b):
Apache 2.4.62 官方 tar.gz 源码包是 Linux 及类 Unix 系统构建 Web 服务器的核心基础。通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
-
tomcat-a(端口 8080):在
$CATALINA_HOME/conf/server.xml的下添加: <host name="www.a.com" appbase="webapps-a" unpackwars="true" autodeploy="true"></host>
然后在conf/Catalina/www.a.com/下建ROOT.xml,指定docBase="/path/to/app-a" -
tomcat-b(端口 8088):同样在它的 server.xml 中添加:
<host name="www.b.com" appbase="webapps-b" unpackwars="true" autodeploy="true"></host>
对应建立conf/Catalina/www.b.com/ROOT.xml,指向docBase="/path/to/app-b"
启动后,可直接通过 http://www.a.com:8080 和 http://www.b.com:8088 验证是否生效。
Apache 端:按域名做 ProxyPass 分流
在 Apache 的 httpd.conf 或站点配置文件中,启用 mod_proxy 和 mod_proxy_ajp(推荐 AJP,更高效):
- 确保已加载模块:
LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_ajp_module modules/mod_proxy_ajp.so - 为每个域名写一个
<virtualhost></virtualhost>块:<virtualhost><br> ServerName www.a.com<br> ProxyPass / ajp://localhost:8009/<br> ProxyPassReverse / ajp://localhost:8009/<br></virtualhost>
注意:这里假设 tomcat-a 的 AJP 连接器端口是8009(查其 server.xml 中的 port 属性) - 同理,为 www.b.com 写另一个 VirtualHost,ProxyPass 指向
ajp://localhost:8010/(对应 tomcat-b 的 AJP 端口)
补充关键点
域名解析和本地测试需同步到位:
- 确保
www.a.com和www.b.com在 DNS 或本机/etc/hosts(Windows 是C:\Windows\System32\drivers\etc\hosts)中都映射到服务器 IP,例如:127.0.0.1 www.a.com www.b.com - 每个 Tomcat 的 AJP 连接器必须启用且端口不重叠。若用 HTTP 代理(非 AJP),则 ProxyPass 改为
http://localhost:8080/,但需额外配置 Tomcat 的RemoteIpValve来正确识别原始 Host 和客户端 IP - Apache 配置完成后务必重启:
systemctl restart httpd或apachectl graceful










