[英]sticky session with apache web server and tomcat servers
我使用 apache web 服務器作為 apache 后面兩個 tomcat 實例的負載平衡器。 當第一個請求到達節點 A 並且來自同一客戶端的第二個請求到達節點 B 時,我無法訪問節點 A 內的會話變量。很明顯。 我在互聯網上沖浪,發現啟用粘性會話會有所幫助。 但是所有在 apache 中啟用粘性會話的教程看起來都很混亂。 是否有任何簡單的分步教程? 請幫忙。
來自評論的代碼片段:
ProxyPass /balancer-manager !
ProxyPass /balancer://mycluster/ stickysession=JSESSIONID
ProxyPassReverse /balancer://mycluster/
<Proxy balancer://mycluster>;
BalancerMember ajp://localhost:9001/ route=NodeA1000 retry=10
BalancerMember ajp://localhost:9002/ route=NodeB1000 retry=10
</Proxy>
這對我有用...
而不是在 ProxyPass 指令中使用 stickysession=JSESSIONID 它必須使用 ProxySet stickysession=JSESSIONID 在平衡器配置中設置:
<Proxy balancer://mybalancer>
BalancerMember ajp://server1:8009 route=tomcat1
BalancerMember ajp://server2:8009 route=tomcat2
ProxySet lbmethod=bytraffic
ProxySet stickysession=JSESSIONID
</Proxy>
ProxyPass /myapp/ mybalancer://myapp/
當我在 ProxyPass 中使用它時,它對我不起作用,如下所示:
ProxyPass /myapp/ mybalancer://myapp/ stickysession=JSESSIONID
為了讓 apache httpd 將您的會話綁定到同一個后端,它需要知道哪個 cookie 保留了會話 ID。 對於java,這(通常)是JSESSIONID 。
如果您使用的是ProxyPass
指令,請使用
ProxyPass /example http://backend.example.com stickysession=JSESSIONID
請試試這個,我相信這對你有用。
步驟 1:在 httpd.conf 中添加以下代碼:
<Proxy balancer://mycluster>
BalancerMember http://<NODE1>/<APP>/ route=jvm1
BalancerMember http://<NODE2>/<APP>/ route=jvm2
ProxySet lbmethod=bytraffic
ProxySet stickysession=JSESSIONID
</Proxy>
ProxyPass /<APP>/ balancer://mycluster/
ProxyPassReverse /<APP>/ balancer://mycluster/
步驟 2:在 server.conf 中添加以下代碼:
a) <NODE1>
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
b) <NODE2>
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm2">
這也是我遇到的一個問題 - 如果您在 vhost 中定義您的平衡器,那么它似乎使用了記錄的粘性會話。 但是,如果您在使用的虛擬主機之外定義平衡器,則粘性會話會丟失,因此您必須在平衡器本身內使用 ProxySet 設置它。
上述解決方案均不適合我,但我在此處的 MOTECH 項目文檔中找到了它: http ://docs.motechproject.org/en/latest/deployment/sticky_session_apache.html
此配置適用於我(在 Apache 2.4.41 上):
<VirtualHost *:80>
(...)
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
(...)
<Proxy balancer://mycluster>
(...)
BalancerMember http://10.20.30.40:8080 route=backend-1 enablereuse=On
BalancerMember http://10.20.30.41:8080 route=backend-2 enablereuse=On
ProxySet lbmethod=bytraffic
ProxySet stickysession=ROUTEID
(...)
</Proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
(...)
</VirtualHost>
我認為您的問題是您在使用 mybalancer 的地方使用了 balancer:
ProxyPass /myapp/ balancer://mybalancer/ stickysession=JSESSIONID
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.