我使用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>
答案 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
答案 1 :(得分:11)
对于apache httpd来保持你的会话绑定到同一个后端,它需要知道哪个cookie保留了会话ID。对于java,这通常是 JSESSIONID 。
如果您使用的是ProxyPass
指令,请使用
ProxyPass /example http://backend.example.com stickysession=JSESSIONID
答案 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