2013-09-26 222 views
3

我正努力在几个应用程序服务器前设置一个Apache httpd负载均衡器。这是我的配置:使用Apache HTTPD的负载均衡器

ProxyRequests off 

<Proxy balancer://mycluster> 

    BalancerMember http://127.0.0.1:8080 
    BalancerMember http://remote-svr:8080 
    ProxySet lbmethod=bybusyness 
    ProxySet stickysession=JESSIONIDSSO 
</Proxy> 

<Location /balancer-manager> 
    SetHandler balancer-manager 
</Location> 

ProxyPass /balancer-manager ! 
ProxyPass/balancer://mycluster/ 
ProxyPassReverse/balancer://mycluster/ 
ProxyPassReverseCookieDomain http://127.0.0.1:8080 localhost 
ProxyPassReverseCookieDomain http://remote-svr:8080 localhost 

我不知道最后两行按兵不动,虽然许多例子,我在网上看了他们使用一个,所以我加了他们,看它是否固定我的问题(它没有)。

的问题是,如果我注释掉要么BalancerMember线,例如:

#BalancerMember http://127.0.0.1:8080 
    BalancerMember http://remote-svr:8080 

然后从用户的角度来看的行为是好的,但是当两个成员是活动的,行为是错误的。

该应用程序最初显示一个登录屏幕,但是当两个负载均衡器都处于活动状态时,用户提交用户名和密码时会重新导向到登录屏幕,可能会丢失会话。有谁知道这个问题可能是什么?

编辑 - 现在的工作

作参考,这一设置现在似乎工作:

ProxyRequests off 
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED 

<Proxy balancer://mycluster> 

    BalancerMember http://127.0.0.1:8080 route=localServer 
    BalancerMember http://remote-svr:8080 route=remoteServer 
    ProxySet lbmethod=bybusyness 
    ProxySet stickysession=ROUTEID 
</Proxy> 

<Location /balancer-manager> 
    SetHandler balancer-manager 
</Location> 

ProxyPass /balancer-manager ! 
ProxyPass/balancer://mycluster/ 
ProxyPassReverse/balancer://mycluster/ 

注意“路线”属性的各个节点需要在节点本身(服务器上设置。在这种情况下,服务器运行JBoss时为xml)。 JSESSIONID对单个应用程序的粘滞会话cookie起作用,但每个服务器上都有多个应用程序,并且用户需要为所有应用程序使用相同的节点。

+0

如果您怀疑粘性被破坏,可以尝试在文档的[疑难解答](http://httpd.apache.org/docs/2.4/mod/mod_proxy_balancer.html#stickyness_troubleshooting)部分中介绍的内容,可能会得到你转发? – Qben

+0

您必须启用应用程序服务器之间的会话共享,否则不会知道登录到另一个应用程序服务器。 – EJP

+0

EJP,会话共享会对代码进行相当多的修改,目前这不是一种选择。我们希望使用粘性会话来避免这种情况,通过确保每次都将单个用户路由到同一个应用服务器,但不同的用户将使用不同的应用服务器。 –

回答

1

如果我猜你可能失去会话由于在本节一个错字:

<Proxy balancer://mycluster> 
    BalancerMember http://127.0.0.1:8080 
    BalancerMember http://remote-svr:8080 
    ProxySet lbmethod=bybusyness 
    ProxySet stickysession=JESSIONIDSSO 
</Proxy> 

ProxySet stickysession=JESSIONIDSSO可能应该说ProxySet stickysession=JSESSIONIDSSO?或者甚至可以JSESSIONID

+0

谢谢,那肯定是错误的,JSESSIONIDSSO应该没问题,因为该cookie用于单点登录到多个应用程序,但JSESSIONIDSSO或JSESSIONID都不能在配置中工作。 –