簡體   English   中英

與 apache web 服務器和 tomcat 服務器的粘性會話

[英]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 docs中,因為解決起來很痛苦。

為了讓 apache httpd 將您的會話綁定到同一個后端,它需要知道哪個 cookie 保留了會話 ID。 對於java,這(通常)是JSESSIONID

如果您使用的是ProxyPass指令,請使用

ProxyPass /example http://backend.example.com stickysession=JSESSIONID

可在優秀的 apache httpd 文檔中找到

請試試這個,我相信這對你有用。

步驟 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM