[英]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 httpd 将您的会话绑定到同一个后端,它需要知道哪个 cookie 保留了会话 ID。 对于java,这(通常)是JSESSIONID 。
如果您使用的是ProxyPass
指令,请使用
ProxyPass /example http://backend.example.com stickysession=JSESSIONID
请试试这个,我相信这对你有用。
步骤 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.