我有3台机器。 一个(loadbalance.lan)用作负载均衡器,另外两个(172.16.30.5和172.16.30.6)是tomcat的服务器。 tomcat的主页正在侦听端口8080
我在浏览器中输入loadbalance.lan / tomcat,我能看到其中一个tomcat内容(默认的tomcat页面) 问题是页面显示不正确。没有图像,当我点击任何链接时,它显示404未找到错误。 让我们说我想访问tomcat网站上的一个子页面。 Tomcat网站地址:172.16.30.5:8080 现在我可以选择,让我说“状态”链接将我重定向到:172.16.30.5:8080 / manager / status(并且工作正常)
当我访问同一页面但通过反向代理服务器(loadbalance.net)并单击loadbalance.lan页面上的链接时,链接会将我重定向到loadbalance.lan / manager / status,我收到404错误。 当然,当我输入浏览器loadbalance.lan / tomcat / manager / status时,它显示正确。
图像问题也很奇怪。当我使用url:loadbalance.lan / tomcat时我看不到图像(Tomcat标识) 当我使用这个:loadbalance.lan / tomcat /(最后斜线)没关系。至少图像因为链接仍然在错误的位置重定向。
这是我的loadbalance.lan apache config:
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
<VirtualHost *:80>
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
<Proxy balancer://cluster>
Order Deny,Allow
Allow from all
</Proxy>
<Proxy balancer://cluster>
BalancerMember http://172.16.30.5:8080
BalancerMember http://172.16.30.6:8080
<Proxy balancer://cluster>
</Proxy>
<Location /tomcat>
ProxyPass balancer://cluster
ProxyPassReverse balancer://cluster
</Location>
</VirtualHost>
有人可以帮我吗? 显然这个代理有问题,但我不知道如何解决这个问题:(
答案 0 :(得分:2)
来自ProxyPassReverse文档(强大添加):
此指令允许Apache调整HTTP重定向响应中的位置,内容位置和 URI标头中的网址。当Apache被用作反向代理(或网关)以避免绕过反向代理时,这是必不可少的,因为后端服务器上的HTTP重定向位于反向代理之后。
只会重写上面具体提到的HTTP响应头。 Apache不会重写其他响应头,也不会重写HTML页面中的URL引用。这意味着如果代理内容包含绝对URL引用,则它们将绕过代理。查看HTML并重写URL引用的第三方模块是Nick Kew的 mod_proxy_html 。
所以,如果代理内容不知道最终网址应该包含/tomcat
扩展且代理服务器没有,那么代理作业不会重写页面的html内容改变页面...你被卡住了。
这通常是你看不到的东西,因为172.16.30.5:8080
部分在localhost.lan
中被很好地重写,但是这个重写不是由代理进行的,当然,因为url实际上只是相对的(<img src="/foo/bar.png">
{1}})。检查页面的源代码,看看域名是否真的在URL中重写。
有几种处理方法:
- 您可以避免在代理中更改相对URL路径(因此不使用tomcat/
前缀,而是使用名称为tomcat.lodabalncer.lan
)的专用虚拟主机。
- 您也可以使用一些专用工具,如mod_proxy_html来重写页面内容,但这是一个缓慢而复杂的事情。
- 第三种方法是管理应用程序端的最终完整URL(这里是tomcat)并检测X-Forwareded-for Header中的代理链元素以重建正确的域。
- 有些应用程序提供了相应的工具,例如Zope中的VirtualHostMonster
对于tomcat,首选工具为mod_proxy_ajp
而非mod_proxy
。但对于负载均衡器代理,我认为您不能使用mod_proxy_ajp
。而且,自从我做了很长时间以后,但在我的记忆中,我认为mod_jk
就是解决方案。
阅读此full documentation on tomcat proxying了解详情。至少你应该得到一些解决方案的提示。