具有粘性會話和 DNS RR 的 httpd ProxyPass
我正在使用帶有 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 正在按設計工作。問題是你建立的架構永遠不會工作。您需要設置
route
inhttpd.conf
和jvmRoute
inserver.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
,並確保它與上面定義的路由一致。