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

2022-09-02 20:09:16

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

答案 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文档中,因为这是一个非常痛苦的解决。


答案 2

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

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

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

可以在优秀的apache httpd文档中找到。


推荐