Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 阿帕奇&x2B;Tomcat-粘性会话和负载平衡问题_Java_Apache_Tomcat_Load Balancing_Mod Proxy Balancer - Fatal编程技术网

Java 阿帕奇&x2B;Tomcat-粘性会话和负载平衡问题

Java 阿帕奇&x2B;Tomcat-粘性会话和负载平衡问题,java,apache,tomcat,load-balancing,mod-proxy-balancer,Java,Apache,Tomcat,Load Balancing,Mod Proxy Balancer,我在Apache mod_proxy_平衡器中遇到了一些关于粘性会话的问题 我们用Java开发了一个restful Web服务,运行在Tomcat上。实际后端使用的是Acegi安全性,带有Auth Basic身份验证 架构是(抱歉,我是新用户,无法发布图像): 我们有这个“Java反向代理”来执行各种业务。它还对Tomcat(Tomcat1、Tomcat2)执行基本的身份验证 最终用户调用URL的方式如下:http:///a/b?username=foo&password=bar&session

我在Apache mod_proxy_平衡器中遇到了一些关于粘性会话的问题

我们用Java开发了一个restful Web服务,运行在Tomcat上。实际后端使用的是Acegi安全性,带有Auth Basic身份验证

架构是(抱歉,我是新用户,无法发布图像):

我们有这个“Java反向代理”来执行各种业务。它还对Tomcat(Tomcat1、Tomcat2)执行基本的身份验证

最终用户调用URL的方式如下:http:///a/b?username=foo&password=bar&session=xxx

然后,反向代理将请求代理给Apache,并将凭据作为基本身份验证令牌一起发送

最终用户有三个不同的URL:

http://<java reverse proxy domain>/service1
http://<java reverse proxy domain>/service2
http://<java reverse proxy domain>/service3
这很好,因为请求的目标是tomcat2

但当我呼叫服务3时,我得到:

[Wed Feb 22 10:49:27 2012] [debug] mod_proxy_balancer.c(280): proxy: BALANCER: Found value "3FB8F8135173BBBE78E5E4BBD6F5C8FB" for stickysession JSESSIONID
[Wed Feb 22 10:49:27 2012] [debug] mod_proxy_balancer.c(1003): proxy: Entering byrequests for BALANCER (balancer://cluster)
[Wed Feb 22 10:49:27 2012] [debug] mod_proxy_balancer.c(1046): proxy: byrequests selected worker "http://xxx:9671" : busy 0 : lbstatus 0
如您所见,即使JSESSIONID cookie是相同的,Apache也会将请求发送到错误的tomcat(这里是tomcat1)

可能是因为service3的url不需要身份验证基本身份验证,而service1和service2需要身份验证基本身份验证吗

我很确定我做错了什么,但我已经四处寻找了很长时间,我无法让它发挥作用

非常感谢你的帮助


谢谢

我在您的JSESSIONID上没有看到jvmRoute后缀。mod_代理使用jvmRoute将粘性会话正确路由到Tomcat实例。jvmRoute是在tomcat服务器配置中声明的(其中每个服务器实例都有自己唯一的jvmRoute标识符。

也许这会有所帮助。这是我在web服务器上的配置:

<Proxy balancer://hybriscluster>
BalancerMember ajp://tomcatServer1:8009 route=tomcat1 keepalive=On ping=5 max=200 ttl=120
BalancerMember ajp://tomcatServer2:8009 route=tomcat2 keepalive=On ping=5 max=200 ttl=120
ProxySet stickysession=JSESSIONID|jsessionid lbmethod=byrequests timeout=60
</Proxy>

平衡员ajp://tomcatServer1:8009 路由=tomcat1 keepalive=开启ping=5最大值=200 ttl=120
平衡员ajp://tomcatServer2:8009 路由=tomcat2 keepalive=开启ping=5最大值=200 ttl=120
ProxySet stickysession=JSSessionID | JSSessionID lbmethod=byrequests timeout=60
tomcat服务器1的server.xml中的配置:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"}">

我也面临同样的问题,通过修改下面的行解决了它-

ProxyPass /test balancer://mycluster stickysession=JSESSIONID|jsessionid scolonpathdelim=On
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.2:80 route=node1
BalancerMember http://192.168.1.3:80 route=node2
</Proxy>
代理通过/测试balancer://mycluster stickysession=JSSessionId | JSSessionId scolonpathdelim=On
平衡员http://192.168.1.2:80 路由=节点1
平衡员http://192.168.1.3:80 路由=节点2
请注意配置scolonpathdelim=On
参考-

没错,在我提供的示例中,我忘记了jvmRoute。但是即使在server.xml中设置它也不能解决这个问题。
<Proxy balancer://hybriscluster>
BalancerMember ajp://tomcatServer1:8009 route=tomcat1 keepalive=On ping=5 max=200 ttl=120
BalancerMember ajp://tomcatServer2:8009 route=tomcat2 keepalive=On ping=5 max=200 ttl=120
ProxySet stickysession=JSESSIONID|jsessionid lbmethod=byrequests timeout=60
</Proxy>
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"}">
ProxyPass /test balancer://mycluster stickysession=JSESSIONID|jsessionid scolonpathdelim=On
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.2:80 route=node1
BalancerMember http://192.168.1.3:80 route=node2
</Proxy>