与apache web服务器和tomcat服务器的粘性会话

时间:2011-05-16 13:50:32

标签: java apache tomcat

我使用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> 

6 个答案:

答案 0 :(得分:16)

这对我有用......

不要在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文档中,因为解决这个问题很难。

答案 1 :(得分:11)

对于apache httpd来保持你的会话绑定到同一个后端,它需要知道哪个cookie保留了会话ID。对于java,这通常是 JSESSIONID

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

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

可在the excellent apache httpd documentation找到。

答案 2 :(得分:6)

请试试这个,我相信这对你有用。

步骤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">

答案 3 :(得分:2)

这也是我遇到的一个问题 - 如果你在vhost中定义你的平衡器,那么它似乎使用了文件中的stickysession。但是,如果你在vhost之外定义一个平衡器,那么stickysession就会丢失,所以你必须在平衡器本身内使用ProxySet来设置它。

答案 4 :(得分:1)

以上解决方案都不适合我,但我在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>

答案 5 :(得分:0)

我认为你的问题是你正在使用mybalancer你有使用平衡器:

ProxyPass /myapp/ balancer://mybalancer/ stickysession=JSESSIONID