【问题标题】:sticky session with apache web server and tomcat servers与 apache web 服务器和 tomcat 服务器的粘性会话
【发布时间】:2011-08-26 11:33:11
【问题描述】:

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

【问题讨论】:

    标签: java apache tomcat


    【解决方案1】:

    这对我有用...

    不能在 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 文档中,因为解决起来很痛苦。

    【讨论】:

    • 您是否找到了 ProxyPass 上的 stickysession 无法正常工作的任何原因?
    • 在 apache 文档中说,stickysession 在 2.4.4 及更高版本上可用,也许您运行的是旧版本。
    【解决方案2】:

    为了让 apache httpd 将会话绑定到同一个后端,它需要知道哪个 cookie 保存会话 ID。对于 java,这(通常)是 JSESSIONID

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

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

    可以在the excellent apache httpd documentation找到。

    【讨论】:

    • 嗨,它不工作。我配置如下codeProxyPass /balancer-manager! ProxyPass / balancer://mycluster/ stickysession=JSESSIONID ProxyPassReverse / balancer://mycluster/ ; BalancerMember ajp://localhost:9001/ route=NodeA1000 retry=10 BalancerMember ajp://localhost:9002/ route=NodeB1000 retry=10 code
    • @shk:使用浏览器检查 cookie 名称是否正确。它可能配置不同。它可能是小写的。请记住,根据文档,您可以通过逗号分隔多个 cookie 名称
    • 您好乔里,感谢您的帮助。但是我在浏览器中看不到任何名称为 jsessionid(或 JSESSIONID)的 cookie。我需要在 tomcat/apache 中对此进行任何配置吗?
    • @shk:要将您的请求链接到正确的会话,服务器需要一个密钥。这通常通过 cookie 或作为 url 的一部分来完成。通常,tomcat 会自动执行此操作。尝试在没有代理的情况下连接到您的 tomcat 并检查您的会话是否正常工作,然后搜索密钥。这是一个全新的问题:)
    • @Joeri,谢谢我会试试这个。
    【解决方案3】:

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

    Step-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/
    

    Step-2:在 server.conf 中添加以下代码:

    a) <NODE1>
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">    
    b) <NODE2>
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm2">
    

    【讨论】:

      【解决方案4】:

      这也是我遇到的一个问题 - 如果您在虚拟主机中定义平衡器,那么它似乎使用了所记录的粘性会话。但是,如果您在其使用的虚拟主机之外定义平衡器,则粘性会话会丢失,因此您必须使用平衡器本身内的 ProxySet 设置它。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 2017-04-19
            • 2022-06-12
            • 2013-08-28
            • 1970-01-01
            • 2013-11-27
            • 1970-01-01
            • 2018-03-20
            • 2016-12-30
            • 1970-01-01
            相关资源
            最近更新 更多