У меня возникли проблемы с Apache mod_proxy_balancer относительно липких сеансов.Apache + Tomcat - Проблемы с липкими сеансами и балансировкой нагрузки
Мы разработали спокойный веб-сервис в Java, работающий на Tomcat. Фактический бэкэнд использует защиту Acegi, с аутентификацией Auth Basic.
Архитектура (жаль, что я новичок, я не могу добавлять изображения):
--------------------
|Java Reverse Proxy|
--------------------
|
--------------------
|Apache load balancer|
--------------------
|
--------|--------
| |
-------- --------
|tomcat1| |tomcat2|
-------- --------
У нас есть это «Java Reverse Proxy» для выполнения различных бизнес-вещи. Он также выполняет аутентификацию Basic Auth на Tomcat (Tomcat1, Tomcat2).
Конечный пользователь называет URLs, как: HTTP: /// A/B: имя пользователя = Foo & пароль = бар & сессии = ххх
Обратный прокси-сервер затем передает запрос Apache, посылая по проверке полномочий в качестве основных токенов Auth.
Конечный пользователь имеет три различных URLs:
http://<java reverse proxy domain>/service1
http://<java reverse proxy domain>/service2
http://<java reverse proxy domain>/service3
Только service1 и service2 защищены с помощью Acegi. service3 анонимно доступен (это требование).
У нас имеется следующая конфигурация в Apache для выполнения балансировки нагрузки:
<Proxy balancer://cluster>
Header set Cache-Control no-cache
Header set Pragma no-cache
BalancerMember http://xxx:9671 route=server1
BalancerMember http://xxx:9672 route=server2
</Proxy>
ProxyPreserveHost On
ProxyPass/balancer://cluster/ stickysession=JSESSIONID
ProxyPassReverse/balancer://cluster/ stickysession=JSESSIONID
На первом обращении к Service1, затем JSESSIONID возвращается к пользователю, а затем он посылает эту информацию о сессии в рамках запроса (в строке запроса, параметре сеанса)
Для поддержания состояний сеансов в кодах backend (tomcat1, tomcat2), обратный прокси java получает сеанс из строки запроса и отправляет его в проксированные коты как JSESSIONID cookie.
Все работает отлично для URL-адресов, которые защищены от основной защиты. Но тогда, когда пользователь вызывает третий URL-адрес (который является общедоступным), Apache не выполняет балансировку нагрузки правильно.
Например, когда я называю обслуживание 1 или 2, я получаю следующие Apache журналы:
[Wed Feb 22 10:48:52 2012] [debug] mod_proxy_balancer.c(280): proxy: BALANCER: Found value "3FB8F8135173BBBE78E5E4BBD6F5C8FB" for stickysession JSESSIONID
[Wed Feb 22 10:48:52 2012] [debug] mod_proxy_balancer.c(1003): proxy: Entering byrequests for BALANCER (balancer://cluster)
[Wed Feb 22 10:48:52 2012] [debug] mod_proxy_balancer.c(1046): proxy: byrequests selected worker "http://xxx:9672" : busy 0 : lbstatus 1
Что это прекрасно, так как запрос предназначен для целевой tomcat2.
Но тогда, когда я называю service3, я получаю:
[Wed Feb 22 10:49:27 2012] [debug] mod_proxy_balancer.c(280): proxy: BALANCER: Found value "3FB8F8135173BBBE78E5E4BBD6F5C8FB" for stickysession JSESSIONID
[Wed Feb 22 10:49:27 2012] [debug] mod_proxy_balancer.c(1003): proxy: Entering byrequests for BALANCER (balancer://cluster)
[Wed Feb 22 10:49:27 2012] [debug] mod_proxy_balancer.c(1046): proxy: byrequests selected worker "http://xxx:9671" : busy 0 : lbstatus 0
Как вы можете видеть, даже если печенье JSESSIONID это то же самое, Apache отправляет запрос на неверный кот (здесь tomcat1).
Может ли это быть фактом, что URL-адрес службы3 не требует аутентификации Auth Basic, wherease service1 и service2?
Я уверен, что я сделал что-то неправильно, но я долго смотрел вокруг, и я не могу заставить его работать.
Ваша помощь очень ценится.
Благодаря
Это верно, на примере я предоставил я забыл jvmRoute. Но даже установка его в server.xml не устраняет проблему. –
Попробуйте разместить свой сервер xmls –