Apache HTTPD 中的负载均衡器

4

我正在努力设置几台应用服务器前的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

我不确定最后两行代码是否有用,虽然我在网上查看了许多示例,并发现其中一个使用了这些代码,所以我尝试添加它们以查看是否可以解决我的问题(但实际上并没有作用)。

问题在于,如果我注释掉BalancedMember的任一行,例如:

    #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/ 

注意对于每个节点而言,'route'属性需要在节点本身上设置(在该情况下为server.xml,因为服务器运行的是JBoss)。 JSESSIONID可以作为单个应用程序的黏性会话cookie正常工作,但每个服务器上有不止一个应用程序,并且用户需要使用相同的节点来访问所有应用程序。

如果您怀疑粘性功能出现问题,也许可以尝试文档中故障排除部分所描述的方法来解决问题? - Qben
你必须在应用服务器之间启用会话共享,否则一个服务器不知道另一个服务器的登录信息。 - user207421
EJP,会话共享需要对代码进行相当大的修改,这在目前不是一个选项。我们想使用粘性会话来避免这种情况,通过确保每个单独的用户每次都被路由到同一个应用服务器,但不同的用户将使用不同的应用服务器。 - Patata Pequeña
谢谢Qben,看起来很有用 - 奇怪的是,在为此添加一些日志记录后,配置似乎已经开始工作了,尽管没有进行任何其他更改。可能还有其他原因导致它开始工作,但至少现在看起来没问题了。 - Patata Pequeña
1个回答

3
如果我要猜测的话,你可能会因为这个部分的拼写错误而丢失会话:
<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


谢谢,那肯定是错的,JSESSIONIDSSO应该没问题,因为该cookie用于单点登录到多个应用程序,但在配置中似乎都不起作用。 - Patata Pequeña

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接