Apache 和 Tomcat:ProxyPass 和 ProxyPassReverse
Posted
技术标签:
【中文标题】Apache 和 Tomcat:ProxyPass 和 ProxyPassReverse【英文标题】:Apache & Tomcat: ProxyPass and ProxyPassReverse 【发布时间】:2012-11-13 01:27:05 【问题描述】:我在配置 Apache 和 Tomcat 时遇到问题,是这样的场景:
我有一个 Apache Web 服务器,运行正常,我只需输入以下内容即可访问它:
http://localhost
另外,在这台主机上,我有一个运行良好的 Tomcat;我创建了一个迷你网络应用程序,其中的文件位于“prueba”目录中,我可以输入:
http://localhost:8080/prueba
(我知道Apache运行在80端口,Tomcat运行在8080)
我想要做的是通过 Apache 用户可以访问“pruebas”(在 Tomcat 上运行),我的意思是:
http://localhost/prueba
我已经阅读了很多,我认为有两种方法可以做到这一点,我决定启用代理模块(proxy 和 proxy_ajp,使用 a2enmod),我也读过我必须编辑这个文件:sites-available/default,这是内容:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName 127.0.0.1
DocumentRoot /var/www
ProxyRequests Off
ProxyPreserveHost On
ProxyPass /static/ !
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
.
.
.
Alias /static/ "/apache/www/"
</VirtualHost>
但这并没有正常工作:(
我不得不说我已经尝试了很多改变,就这 2 行,比如:
ProxyPass /prueba ajp://localhost:8009/prueba
ProxyPassReverse /prueba ajp://localhost:8009/prueba
或
ProxyPass / ajp://localhost:8009/prueba
ProxyPassReverse / ajp://localhost:8009/prueba
(每次编辑文件时,我都会重新启动 apache)
但是当我访问 [http://localhost/prueba/] 时,我有: 服务暂时不可用
有人知道为什么吗? 在此先感谢各位。
Pd:我正在使用 apache 2.2.17 和 tomcat6。
【问题讨论】:
对于任何偶然发现此问题的人(正如我刚刚遇到的那样)--如果您在 Apache 错误日志中看到此内容:...[错误] (13)权限被拒绝:代理:HTTP:尝试连接到 127.0.0.1... 您可以尝试通过运行以下命令来配置 SELinux(当然,如果您使用的是 SELinux): setsebool -P httpd_can_network_connect 1 参考:wiki.apache.org/httpd/13PermissionDenied 【参考方案1】:你必须放
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
在您的 apache 虚拟主机上
然后你必须在tomcat中取消注释ajp监听器
<Connector port="8009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />
然后你必须在 server.xml 中配置主机和上下文路径
参考: http://www.ntu.edu.sg/home/ehchua/programming/howto/ApachePlusTomcat_HowTo.html
希望对你有所帮助..
【讨论】:
【参考方案2】:ProxyPassReverse
定义了 Apache httpd 应该将 URL 重写到的 URL,这将重定向到代理(隐藏)的 URL。因此,您应该将ProxyPassReverse
行更改为如下内容:
ProxyPassReverse / http://localhost/prueba/
另请参阅:http://httpd.apache.org/docs/2.2/mod/mod_proxy_ajp.html#usage
【讨论】:
【参考方案3】:试试这个:
ProxyPass /prueba/ http://localhost:8009/prueba/
ProxyPassReverse /prueba/ http://localhost:8009/prueba/
然后从浏览器中点击以下 URL:http://localhost/prueba/
注意:必须添加“/prueba/”
【讨论】:
【参考方案4】:可能由于 SELinux 导致服务不可用,请尝试禁用 SE Linux:setenforce 0
【讨论】:
禁用 SELinux 并不是让它工作的必要条件(禁用安全性作为一种快速解决方法也不是很好的做法)。 事实上,如果是由 SELinux 引起的问题,您可以运行以下命令:【参考方案5】:您可以尝试添加:
ProxyPreserveHost On
From the documentation:
“启用后,此选项将传入请求中的 Host: 行传递给代理主机,而不是 ProxyPass 行中指定的主机名。
此选项通常应关闭。它在特殊配置中非常有用,例如基于代理的海量名称的虚拟主机,其中原始 Host 标头需要由后端服务器评估。”
【讨论】:
【参考方案6】:你说:我可以打字:
http://localhost:8080/prueba
但以下不起作用:
ProxyPass /prueba/http://localhost:8009/prueba/
8080 != 8009
确保您的端口号相同
【讨论】:
【参考方案7】:8009 端口是 Tomcat,所以使用 ajp 而不是 http
ProxyPass /prueba/ ajp://localhost:8009/prueba/
ProxyPassReverse /prueba/ ajp://localhost:8009/prueba/
【讨论】:
以上是关于Apache 和 Tomcat:ProxyPass 和 ProxyPassReverse的主要内容,如果未能解决你的问题,请参考以下文章
使用 Apache ProxyPass 的反向代理重定向而不是透明地通过
Tomcat 的 Apache (httpd) 代理不断超时