我正在使用带有 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 按照设计运行。问题是您设置的架构永远无法工作。您需要设置route
inhttpd.conf
和jvmRoute
in并使其一致。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