2012-06-01 77 views
3

我現在有一個Apache服務器和兩個Tomcat服務器。他們使用mod_jk模塊連接。並配置負載均衡。所有的請求將被重定向到負載均衡器,在httpd.conf:Apache和Tomcat的負載平衡與URL重定向

JKMount /* controller 

控制器是負載均衡器,以及工作的Tomcat服務器worker1,worker2。

問題是,除了自動加載調度之外,我還需要一個匹配重定向的url。特別是,對http://www.example.com/test1/index.html的請求應該發送給worker1(Tomcat),並且http://www.example.com/test2/index.html發送給worker2。 但是,在worker1和worker2中,應用程序結構都是webapps/test/structure。

我可以使用mod_jk url映射來派遣/ test1 /到worker1和/ test2 /到worker2,但是PATH將會是/ test1 /和/ test2/not/test /。同時,如果我使用apache redirectMatch或url rewrite將/ test1 /(/ test2 /)更改爲/ test /,mod_jk現在不會將url分發給不同的worker,因爲它們具有相同的PATH。

我該如何處理這種情況?

+0

如果您需要在代理期間修改路徑,mod_proxy_ajp可能對您更好。 –

回答

2

也許一個簡單的方法是在tomcat worker上使用urlrewrite過濾器。據documantation,你應該有你的urlrewrite.xml文件以下規則:

<rule> 
     <from>^/test[0-9]*/(.*)$</from> 
     <to type="redirect">/$1</to> 
    </rule> 

那麼工人會忽略TEST1或TEST2 URI的一部分。而Apache可以按照你計劃使用mod_jk的方式工作。

3

您需要將應用程序作爲Tomcat中的根應用程序。您可以通過添加一個META-INF/context.xml中爲您的應用有以下這樣做:

<Context path="/"/> 

我建議你從webapps目錄中刪除其他應用程序。然後,你需要改變你的應用程序的web.xml這樣的servlet(S)現在映射到相應的URL與適當的上下文:

<servlet-mapping> 
    <servlet-name>TestApp</servlet-name> 
    <url-pattern>/test</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>TestApp</servlet-name> 
    <url-pattern>/test1</url-pattern> 
</servlet-mapping> 

第二JVM的應用程序將需要的url-pattern/test2的,而不是。對於Apache/Tomcat連接,我使用mod_ajp而不是mod_jk。下面是你需要什麼阿帕奇mod_ajp:

<Proxy balancer://cluster> 
    BalancerMember ajp://127.0.0.1:8015 route=ajp13_node1 
    BalancerMember ajp://127.0.0.1:8016 route=ajp13_node2 
</Proxy> 
<Location "/test"> 
    ProxyPass balancer://cluster/test stickysession=JSESSIONID 
</Location> 
<Location "/test1"> 
    ProxyPass ajp://127.0.0.1:8015/test1 
</Location> 
<Location "/test2"> 
    ProxyPass ajp://127.0.0.1:8016/test2 
</Location> 

這是假設的AJP連接器是在8015監聽第二個第一JVM和8016。