Apache 2.4 Proxy AJP 为多个域提供 Tomcat 8

Apache 2.4 Proxy AJP serve multiple domains with Tomcat 8

我开发了三个基于 Spring 的 Web 应用程序,部署在我的 Tomcat 8 服务器上。我可以通过以下方式在 LAN 中访问它们:

http://localhost:8080/webapps1
http://localhost:8080/webapps2
http://localhost:8080/webapps3

这对我来说很好。

Tomcat AJP 连接器配置为:

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

现在我尝试通过 AJP 连接器使用 apache 2.4 代理配置将所有三个应用程序发布到 Internet

我也注册了三个 FQDN 例如:

www.thss.domain1.com.au
www.stoa.domain2.com.au
ozssc.stoa.domain2.com.au

我用 check-host.net 测试了这三个 FQDN,它们都工作正常。

现在我将使用代理虚拟主机设置来配置我的apache 2.4,将文件名配置为:apache-serviceproxy.conf in /Library/Server/Web/Config/Proxy

......
listen 10.0.1.100:80
......
<VirtualHost 10.0.1.100:80>
  ProxyPreserveHost On
  ServerName www.thss.domain1.com.au
  ServerAlias thss.domain1.com.au
  ServerAdmin admin@domain1.com.au
  ProxyPass / ajp://127.0.0.1:8009/webapps1/
  ProxyPassReverse / ajp://127.0.0.1:8009/webapps1/
</VirtualHost>
<VirtualHost 10.0.1.100:80>
  ProxyPreserveHost On
  ServerName www.stoa.domain2.com.au
  ServerAlias stoa.domain2.com.au
  ServerAdmin admin@domain1.com.au
  ProxyPass / ajp://127.0.0.1:8009/webapps2/
  ProxyPassReverse / ajp://127.0.0.1:8009/webapps2/
</VirtualHost>
<VirtualHost 10.0.1.100:80>
  ProxyPreserveHost On
  ServerName ozssc.stoa.domain2.com.au
  ServerAdmin admin@domain1.com.au
  ProxyPass / ajp://127.0.0.1:8009/webapps3/
  ProxyPassReverse / ajp://127.0.0.1:8009/webapps3/
</VirtualHost>

请注意,FQDN 2 和 3 在同一域 (domain2.com.au) 中工作,而 FQDN 1 在其他域 (domain1.com.au) 中工作

我使用 net renderer.com 在 Internet 上进行了测试,FQDN 1 www.thss。domain1.com.au 运行良好,但 FQDN 2 和 3 运行不佳,我检查了我的 tomcat访问日志我发现了一些很有趣的东西。

详情为:

当我从 Internet 访问我的第一个 FQDN (www.thss.domain1.com.au) 时,请求通过:路由器 -> Apache 2.4(端口 80) -> AJP 连接器 (8009) -> Tomcat 8.0.28 成功,所有页面运行良好。

Tomcat访问日志显示:

58.106.1.75 - - [01/Nov/2015:09:37:40 +1100] "GET /webapps1/ HTTP/1.1" 200 2616
58.106.1.75 - - [01/Nov/2015:09:37:40 +1100] "GET /webapps1/css/thss_layout.css HTTP/1.1" 200 1405
58.106.1.75 - - [01/Nov/2015:09:37:40 +1100] "GET /webapps1/js/dojo-release-1.8.6/dojo/dojo.js HTTP/1.1" 200 158637

这意味着,html 请求,包括 css/js 文件请求都使用单个上下文路径 /webapps1,这是完美的。

但是当我请求 FQDN 2 (www.stoa.domain2.com.au) 和 3 (ozssc.stoa.domain2.com.au) 时,只有第一个请求带有正确的上下文路径例如:/webapps2 包含 css 和 js 或图像文件的任何下一个请求都是双上下文路径,例如:/webapps2/webapps2,因为上下文路径格式不正确,Tomcat 响应 404 错误.结果:所有 FQDN 2 和 3 页面不支持 css/js/图像,仅显示一些纯文本。

访问日志显示:

148.251.45.185 - - [01/Nov/2015:08:58:59 +1100] "GET /webapps2/ HTTP/1.1" 200 19098
148.251.45.185 - - [01/Nov/2015:08:59:00 +1100] "GET /webapps2/webapps2/dojo-release-1.10.4/dijit/themes/claro/claro.css HTTP/1.1" 404 1158
148.251.45.185 - - [01/Nov/2015:08:59:01 +1100] "GET /webapps2/webapps2/css/style.css HTTP/1.1" 404 1088
148.251.45.185 - - [01/Nov/2015:08:59:02 +1100] "GET /webapps2/webapps2/images/icons/search33.png HTTP/1.1" 404 1112

我的问题是:如何使用 AJP 配置我的代理而不在通过 AJP 连接器从 apache 2.4 到 tomcat 的请求前面附加重复的上下文路径?

欢迎任何建议!

周末愉快!伴侣

不要更改 ProxyPass 指令中的上下文路径。当您这样做时,有很多很多方法会搬起石头砸自己的脚。

据推测,您网页上的链接是绝对链接,因此它们包含上下文路径。当客户端随后请求这些时,ProxyPass 指令再次添加上下文路径。

最简单的解决方案是为虚拟主机配置 Tomcat 并将您的每个应用程序作为 ROOT Web 应用程序部署在其自己的虚拟主机中。