2012-02-22 4 views
14

У меня возникли проблемы с 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?

Я уверен, что я сделал что-то неправильно, но я долго смотрел вокруг, и я не могу заставить его работать.

Ваша помощь очень ценится.

Благодаря

ответ

5

Я не вижу суффикс jvmRoute на вашем JSessionID. mod_proxy использует jvmRoute для правильного направления липких сеансов в экземпляры Tomcat. jvmRoute объявлен в конфигурации сервера Tomcat (где каждый экземпляр сервера имеет свой собственный уникальный идентификатор jvmRoute

+0

Это верно, на примере я предоставил я забыл jvmRoute. Но даже установка его в server.xml не устраняет проблему. –

+0

Попробуйте разместить свой сервер xmls –

0

Может тис поможет Это мой конфиг на веб-сервере:..

<Proxy balancer://hybriscluster> 
BalancerMember ajp://tomcatServer1:8009 route=tomcat1 keepalive=On ping=5 max=200 ttl=120 
BalancerMember ajp://tomcatServer2:8009 route=tomcat2 keepalive=On ping=5 max=200 ttl=120 
ProxySet stickysession=JSESSIONID|jsessionid lbmethod=byrequests timeout=60 
</Proxy> 

Config в server.xml из TOMCAT сервер 1:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"}"> 
1

я перед тем же самым проблему и решить ее путем модификации ниже линии -

ProxyPass /test balancer://mycluster stickysession=JSESSIONID|jsessionid scolonpathdelim=On 
<Proxy balancer://mycluster> 
BalancerMember http://192.168.1.2:80 route=node1 
BalancerMember http://192.168.1.3:80 route=node2 
</Proxy> 

Обратите внимание scolonpathdelim конфигурации = On Reference - http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html

Смежные вопросы