2013-09-26 53 views
3

我正努力在幾個應用程序服務器前設置一個Apache httpd負載均衡器。這是我的配置:使用Apache HTTPD的負載均衡器

ProxyRequests off 

<Proxy balancer://mycluster> 

    BalancerMember http://127.0.0.1:8080 
    BalancerMember http://remote-svr:8080 
    ProxySet lbmethod=bybusyness 
    ProxySet stickysession=JESSIONIDSSO 
</Proxy> 

<Location /balancer-manager> 
    SetHandler balancer-manager 
</Location> 

ProxyPass /balancer-manager ! 
ProxyPass/balancer://mycluster/ 
ProxyPassReverse/balancer://mycluster/ 
ProxyPassReverseCookieDomain http://127.0.0.1:8080 localhost 
ProxyPassReverseCookieDomain http://remote-svr:8080 localhost 

我不知道最後兩行按兵不動,雖然許多例子,我在網上看了他們使用一個,所以我加了他們,看它是否固定我的問題(它沒有)。

的問題是,如果我註釋掉要麼BalancerMember線,例如:

#BalancerMember http://127.0.0.1:8080 
    BalancerMember http://remote-svr:8080 

然後從用戶的角度來看的行爲是好的,但是當兩個成員是活動的,行爲是錯誤的。

該應用程序最初顯示一個登錄屏幕,但是當兩個負載均衡器都處於活動狀態時,用戶提交用戶名和密碼時會重新導向到登錄屏幕,可能會丟失會話。有誰知道這個問題可能是什麼?

編輯 - 現在的工作

作參考,這一設置現在似乎工作:

ProxyRequests off 
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED 

<Proxy balancer://mycluster> 

    BalancerMember http://127.0.0.1:8080 route=localServer 
    BalancerMember http://remote-svr:8080 route=remoteServer 
    ProxySet lbmethod=bybusyness 
    ProxySet stickysession=ROUTEID 
</Proxy> 

<Location /balancer-manager> 
    SetHandler balancer-manager 
</Location> 

ProxyPass /balancer-manager ! 
ProxyPass/balancer://mycluster/ 
ProxyPassReverse/balancer://mycluster/ 

注意「路線」屬性的各個節點需要在節點本身(服務器上設置。在這種情況下,服務器運行JBoss時爲xml)。 JSESSIONID對單個應用程序的粘滯會話cookie起作用,但每個服務器上都有多個應用程序,並且用戶需要爲所有應用程序使用相同的節點。

+0

如果您懷疑粘性被破壞,可以嘗試在文檔的[疑難解答](http://httpd.apache.org/docs/2.4/mod/mod_proxy_balancer.html#stickyness_troubleshooting)部分中介紹的內容,可能會得到你轉發? – Qben

+0

您必須啓用應用程序服務器之間的會話共享,否則不會知道登錄到另一個應用程序服務器。 – EJP

+0

EJP,會話共享會對代碼進行相當多的修改,目前這不是一種選擇。我們希望使用粘性會話來避免這種情況,通過確保每次都將單個用戶路由到同一個應用服務器,但不同的用戶將使用不同的應用服務器。 –

回答

1

如果我猜你可能失去會話由於在本節一個錯字:

<Proxy balancer://mycluster> 
    BalancerMember http://127.0.0.1:8080 
    BalancerMember http://remote-svr:8080 
    ProxySet lbmethod=bybusyness 
    ProxySet stickysession=JESSIONIDSSO 
</Proxy> 

ProxySet stickysession=JESSIONIDSSO可能應該說ProxySet stickysession=JSESSIONIDSSO?或者甚至可以JSESSIONID

+0

謝謝,那肯定是錯誤的,JSESSIONIDSSO應該沒問題,因爲該cookie用於單點登錄到多個應用程序,但JSESSIONIDSSO或JSESSIONID都不能在配置中工作。 –