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) 代理不断超时

使用 proxyPass 和 proxyPassReverse 的 Apache 重写

windows下apache代理转发tomcat

使用多个 ProxyPass 配置 Apache

Apache + Tomcat:使用 mod_proxy 代替 AJP