Apache 2.4 代理 AJP 使用 Tomcat 8 服务多个域
Posted
技术标签:
【中文标题】Apache 2.4 代理 AJP 使用 Tomcat 8 服务多个域【英文标题】:Apache 2.4 Proxy AJP serve multiple domains with Tomcat 8 【发布时间】:2016-02-01 03:39:19 【问题描述】:我开发了三个基于 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
我也有3个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 在 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 any对包容性 css 和 js 或图像文件的下一个请求是双重上下文路径,例如:/webapps2/webapps2,因为它不是格式正确的上下文路径,Tomcat 响应 404 错误。结果:所有不支持 css/js/image 的 FQDN 2 和 3 页面,仅显示一些纯文本。
访问日志显示:
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 连接器从 apache 2.4 到 tomcat 的请求前面附加重复的上下文路径的情况下使用 AJP 配置我的代理?
欢迎任何建议!
周末愉快!伴侣
【问题讨论】:
谢谢,我笑得很开心:“周末愉快:伙计!” ...但是如果您确实在保护模式下运行;-) 哈。保护模式?? 【参考方案1】:不要更改 ProxyPass 指令中的上下文路径。当你这样做的时候,有很多很多的方法可以让你在脚上开枪。
据推测,您页面上的链接是绝对的,因此它们包含上下文路径。当客户端随后请求这些时,ProxyPass 指令再次添加上下文路径。
最简单的解决方案是将 Tomcat 配置为虚拟主机,并将您的每个应用程序部署为自己的虚拟主机中的 ROOT Web 应用程序。
【讨论】:
嗨。标记。非常感谢!我已经按照您所说的通过使用 tomcat 虚拟主机设置来配置 tomcat 来启用我在互联网上的所有三个应用程序。但由于我稍后将使用 SSL 让我们的客户登录他们的帐户,我仍然更喜欢使用 Apache ->AJP->tomcat 方式,因为 apache 在使用 SSL 方面比使用 tomcat 好得多。以上是关于Apache 2.4 代理 AJP 使用 Tomcat 8 服务多个域的主要内容,如果未能解决你的问题,请参考以下文章
Apache + Tomcat:使用 mod_proxy 代替 AJP