Apache 2.4 代理 AJP 服务于 Tomcat 8 的多个域

标签 apache tomcat configuration proxy ajp

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

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,将文件名配置为:/Library/Server/Web/Config/Proxy 中的 apache-serviceproxy.conf

......
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 在互联网上进行了测试,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 any下一个包含 css 和 js 或图像文件的请求是双上下文路径,例如:/webapps2/webapps2,因为它的上下文路径格式不正确,Tomcat 响应 404 错误。结果:所有 FQDN 2 和 3 页面都没有 css/js/image 支持,只显示一些纯文本。

访问日志显示:

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 应用程序部署在其自己的虚拟主机中。

关于Apache 2.4 代理 AJP 服务于 Tomcat 8 的多个域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33457559/

相关文章:

php - 将用户/组从主机映射到 docker 容器

apache - 使用letencrypt将https重定向到http的https virtualhost apache代理后面的http nginx dockers

php - 我安装了 symfony 3,运行服务器并在运行网络服务器时连接被拒绝

java - 如何使用java代码启动和停止tomcat?

tomcat - Grails 部署到 tomcat,只有一些链接有效

ubuntu - Postfix-Mailman "Recipient address rejected: User unknown in local recipient table"

php - date_default_timezone_set ('UTC' ) 不工作

php - 如何在文件中传递超过 9 个参数。 htaccess(mod_rewrite)?

eclipse - 在不重新加载页面的情况下将 jsp、css、js、html 的更改反射(reflect)到浏览器

docker - 我如何查看某些 docker 守护程序配置的设置?