繁体   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