繁体   English   中英

Apache反向代理和负载均衡器-不能正常工作

[英]Apache reverse proxy and load balancer - does not work as it should

我有3台机器。 一个(loadbalance.lan)用作负载平衡器,另外两个(172.16.30.5和172.16.30.6)是tomcat的服务器。 Tomcat的主页正在侦听端口8080

我在浏览器loadbalance.lan / tomcat中输入内容,我能够看到其中之一的tomcat内容(默认为tomcat页面)。问题是页面无法正确显示。 没有图像,当我单击任何链接时,它显示404 Not found错误。 假设我要访问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徽标)当我使用url:loadbalance.lan / tomcat /(末尾有斜杠)时,就可以了。 至少是图片,因为链接仍会重定向到错误的位置。

这是我的loadbalance.lan apache配置:

   <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>

有人可以帮我吗? 显然该代理存在问题,但我不知道如何解决该问题:(

ProxyPassReverse文档(强烈添加):

通过该指令,Apache可以在HTTP重定向响应上调整LocationContent-LocationURI标头中的URL。 当Apache用作反向代理(或网关)以避免由于反向服务器上的HTTP重定向(位于反向代理后面)而避免绕过反向代理时,这是必不可少的。

仅上面特别提到的HTTP响应标头将被重写。 Apache不会重写其他响应头,也不会重写HTML页面中的URL引用 这意味着,如果代理内容包含绝对URL引用,则它们将绕过代理。 Nick Kew的mod_proxy_html是在HTML内部查看并重写URL引用的第三方模块。

因此, 如果代理的内容不知道最终的URL应该包含/tomcat扩展名,并且代理不会更改页面, 则代理的工作就是不重写页面的html内容

这通常是您看不到的,因为在localhost.lan可以很好地重写172.16.30.5:8080部分,但是该重写不是由代理进行的,可以肯定的是,因为url实际上只是相对的( <img src="/foo/bar.png"> )。 检查页面的源代码,查看域名是否真的用URL重写了。

有几种处理方法:-您可以避免更改代理中的相对url路径(因此,请不要使用tomcat/前缀,而应使用名称为tomcat.lodabalncer.lan的专用虚拟主机)。 -您还可以使用一些专用工具,例如mod_proxy_html来重写页面的内容,但这是一件缓慢而复杂的事情。 -第三种方法是在应用程序端(在此为tomcat)管理最终的完整URL,并在X-Forwareded-for标头中检测代理链元素以重建正确的域。 -一些应用程序为此提供了工具,例如Zope中的VirtualHostMonster

对于tomcat,首选工具是mod_proxy_ajp而不是mod_proxy 但是对于负载平衡器代理,我认为您不能使用mod_proxy_ajp 而且,距离我这样做已经很长时间了,但是在我的记忆中,我认为mod_jk是解决该问题的方法。

阅读有关tomcat代理的完整文档以获取详细信息。 至少您应该获得解决方案的一些提示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM