具有粘性会话和 DNS RR 的 httpd ProxyPass

具有粘性会话和 DNS RR 的 httpd ProxyPass

我正在使用带有 ProxyPass 和 DNS RR 的 apache httpd 以及用于 Tomcat 的粘性 Java 会话。

它不起作用。

我的 apache 配置是:

ProxyPass "/" "balancer://mycluster/" stickysession=JSESSIONID|jsessionid scolonpathdelim=On

<Proxy balancer://mycluster>
    BalancerMember http://stest:8080/
</Proxy>

<Location "/balancer-manager">
    SetHandler balancer-manager
    Require host localhost
</Location>

当我在 httpd 主机上执行操作时,nslookup stest有 5 个主机返回:

root@sproxy:/app# nslookup stest
Server:     127.0.0.11
Address:    127.0.0.11#53

Non-authoritative answer:
Name:   stest
Address: 10.0.0.7
Name:   stest
Address: 10.0.0.6
Name:   stest
Address: 10.0.0.8
Name:   stest
Address: 10.0.0.2
Name:   stest
Address: 10.0.0.5

因此,我的 httpd 服务器应该路由到其中一个 IP 地址,直到JSESSIONID设置了 cookie,然后它应该粘在该 IP 上。

问题是,这不起作用。当我这样做时:

while true; do curl -b /tmp/cj.txt -c /tmp/cj.txt -w '\n' localhost/test-session-servlet/json ; done

我得到了我的 servlet 输出,其中包括我访问的 Tomcat 主机和会话 id。

我预计这只会影响一台服务器,因为 cookie 会被设置/tmp/cj.txt并传递给每个请求。使用上述命令我得到与以下命令相同的输出:

while true; do curl -w '\n' localhost/test-session-servlet/json ; done

(请注意,上述命令不使用 cookies,因此它应该进行负载平衡,即使粘性会话,因为它不传递 cookie)

本质上,两个 curl 命令都会发送到不同的服务器,就好像粘性会话未正确启用一样,但第一个命令不应该这样做。

我在这里做错了什么?

答案1

Tomcat 和 httpd 按照设计运行。问题是您设置的架构永远无法工作。您需要设置routeinhttpd.confjvmRoutein并使其一致。server.xml

一种可能的解决方案是在 httpd.conf 文件中明确定义每个 stest 主机。例如:

<Proxy balancer://mycluster>
  BalancerMember http://10.0.0.2:8080/ route=tc01
  BalancerMember http://10.0.0.5:8080/ route=tc02
  BalancerMember http://10.0.0.6:8080/ route=tc03
  BalancerMember http://10.0.0.7:8080/ route=tc04
  BalancerMember http://10.0.0.8:8080/ route=tc05
</Proxy>

您还需要在每个 Tomcat 实例的元素jvmRoute上设置并确保它与上面定义的路由一致。<Engine>server.xml

相关内容