Tomcat

具有粘性會話和 DNS RR 的 httpd ProxyPass

  • February 3, 2018

我正在使用帶有 ProxyPass 和 DNS RR 的 apache httpd 以及用於 Tomcat 的粘性 Java 會話。

它不工作。

我的apache配置是:

ProxyPass "/" "balancer://mycluster/" stickysession=JSESSIONID|jsessionid scolonpathdelim=On

<Proxy balancer://mycluster>
   BalancerMember http://stest:8080/
</Proxy>

<Location "/balancer-manager">
   SetHandler balancer-manager
   Require host localhost
</Location>

當我nslookup stest在 httpd 主機上執行操作時,我有 5 台主機返回:

root@sproxy:/app# nslookup stest
Server:     127.0.0.11
Address:    127.0.0.11#53

Non-authoritative answer:
Name:   stest
Address: 10.0.0.7
Name:   stest
Address: 10.0.0.6
Name:   stest
Address: 10.0.0.8
Name:   stest
Address: 10.0.0.2
Name:   stest
Address: 10.0.0.5

因此,我的 httpd 伺服器應該路由到這些 IP 地址之一,直到JSESSIONID設置了 cookie,然後它應該對該 IP 具有粘性。

問題是,這不起作用。當我做:

while true; do curl -b /tmp/cj.txt -c /tmp/cj.txt -w '\n' localhost/test-session-servlet/json ; done

我得到了我的 servlet 輸出,其中包括我點擊的 Tomcat 主機和會話 ID。

我希望這只會命中一個伺服器,因為 cookie 被設置/tmp/cj.txt並傳遞給每個請求。我使用上述命令得到的輸出與使用以下命令相同:

while true; do curl -w '\n' localhost/test-session-servlet/json ; done

(注意上面的命令不使用 cookie,所以即使粘性會話也應該進行負載平衡,因為它不傳遞 cookie)

本質上,兩個 curl 命令都發送到不同的伺服器,就好像粘性會話沒有正確啟用一樣,但第一個命令不應該這樣做。

我在這裡做錯了什麼?

Tomcat 和 httpd 正在按設計工作。問題是你建立的架構永遠不會工作。您需要設置routeinhttpd.confjvmRouteinserver.xml並保持一致。

一種可能的解決方案是在 httpd.conf 文件中明確定義每個 stest 主機。就像是:

<Proxy balancer://mycluster>
 BalancerMember http://10.0.0.2:8080/ route=tc01
 BalancerMember http://10.0.0.5:8080/ route=tc02
 BalancerMember http://10.0.0.6:8080/ route=tc03
 BalancerMember http://10.0.0.7:8080/ route=tc04
 BalancerMember http://10.0.0.8:8080/ route=tc05
</Proxy>

您還需要在每個 Tomcat 實例jvmRoute<Engine>元素上設置server.xml,並確保它與上面定義的路由一致。

引用自:https://serverfault.com/questions/895414