1

I have 3 machines. One (loadbalance.lan) is used as a load balancer, the other two (172.16.30.5 and 172.16.30.6) are tomcat's servers. Main page of the tomcat is listening on port 8080

Im typing in the browser loadbalance.lan/tomcat and I am able to see one of the tomcat content (default tomcat page) The problem is page isn't displayed correctly. There's no images and when I click on any link it displays 404 Not found error. Lets say I want to access one of the sub pages on the tomcat website. Tomcat website address: 172.16.30.5:8080 Now I can choose, lets say "status" link which redirects me to: 172.16.30.5:8080/manager/status (and works fine)

When I access the same page but via reverse proxy server (loadbalance.net) and click that link on the loadbalance.lan page, links redirect me to loadbalance.lan/manager/status and I get 404 error. Of course when I type in the browser loadbalance.lan/tomcat/manager/status it displays correct.

Problem with the images is also weird. When I use url: loadbalance.lan/tomcat I can't see images (Tomcat logo) When I use this one: loadbalance.lan/tomcat/ (slash at the end) it's ok. At least images because links still redirect in wrong place.

Here is my 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>

Could someone help me with this? Obviously there is something wrong with that proxy but I have no idea how to fix that :(

4

1 回答 1

2

来自ProxyPassReverse文档(强烈添加):

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

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

所以,代理的工作不是重写页面的 html 内容,如果代理的内容不知道最终的 url 应该包含/tomcat扩展名并且代理不改变页面......你被卡住了。

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

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

对于 tomcat,首选工具是mod_proxy_ajp而不是mod_proxy. 但是对于负载均衡器代理,我认为您不能使用mod_proxy_ajp. 而且,我已经很久没有做这个了,但在我的记忆中,我认为这mod_jk是解决这个问题的方法。

有关详细信息,请阅读有关 tomcat 代理的完整文档。至少你应该得到一些解决方案的提示。

于 2013-11-12T13:01:14.193 回答