使用Apache HTTPD加载平衡器

时间:2013-09-26 12:32:17

标签: apache webserver load-balancing reverse-proxy

我很难在几个应用程序服务器前面设置一个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/ 

请注意,需要在节点本身上设置各个节点的“route”属性(在本例中为server.xml,因为服务器运行JBoss)。 JSESSIONID可以作为单个应用程序的粘性会话cookie,但每个服务器上有多个应用程序,用户需要为所有应用程序使用相同的节点。

1 个答案:

答案 0 :(得分:2)

如果我猜你可能因为本节中的拼写错误而导致会话失败:

<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