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

时间:2013-11-11 16:31:45

标签: apache reverse-proxy

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

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

1 个答案:

答案 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了解详情。至少你应该得到一些解决方案的提示。