Я использую apache httpd с ProxyPass и DNS RR и липкие сеансы Java для Tomcat.
Это не работает.
Моя конфигурация 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>
Когда я выполняю nslookup stest
на хосте httpd, у меня есть 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-адресов. адресов, пока не будет установлен файл cookie JSESSIONID
, а затем он должен быть закреплен за этим IP-адресом.
Проблема в том, что это не работает. Когда я это сделаю:
пока верно; сделать curl -b /tmp/cj.txt -c /tmp/cj.txt -w '\ n' localhost / test-session-servlet / json; done
Я получаю вывод своего сервлета, который включает обнаруженный мной узел Tomcat и идентификатор сеанса.
Я ожидал, что это коснется только одного сервера, поскольку файл cookie устанавливается в /tmp/cj.txt
и передается в каждый запрос. Я получаю тот же результат с помощью приведенной выше команды, что и с:
while true; сделать curl -w '\ n' localhost / test-session-servlet / json; done
(обратите внимание, что приведенная выше команда не использует файлы cookie, поэтому она должна быть сбалансирована по нагрузке, даже с липкими сеансами, потому что она не передает cookie)
По сути, обе команды curl отправляются разным серверов, как если бы липкие сеансы не были включены должным образом, но первые не должны этого делать.
Что я здесь делаю не так?
Tomcat и httpd работают, как задумано. Проблема в том, что созданная вами архитектура никогда не будет работать. Вам необходимо установить и согласовать маршрут
в httpd.conf
и jvmRoute
в server.xml
.
Один из возможных вариантов Решение состоит в том, чтобы явно определить каждый из лучших хостов в вашем файле httpd.conf. Примерно так:
<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>
Вам также необходимо установить jvmRoute
в элементе
в server.xml
каждого экземпляра Tomcat и обеспечить что это соответствует маршруту, определенному выше.