Apache + Tomcat - Проблемы с закрепленными сеансами и балансировкой нагрузки

Я столкнулся с некоторыми проблемами с Apache mod_proxy_balancer, касающимися липких сессий.

Мы разработали спокойный веб-сервис на Java, работающий на Tomcat. Фактический бэкэнд использует безопасность Acegi с аутентификацией Auth Basic.

Архитектура (извините, я новый пользователь, я не могу публиковать изображения):

     --------------------
     |Java Reverse Proxy|
     --------------------
            |
     --------------------
     |Apache load balancer|
     --------------------               
            |
    --------|--------
    |               |
--------        --------    
|tomcat1|       |tomcat2|
--------        --------    

У нас есть этот «обратный прокси-сервер Java» для выполнения различных бизнес-задач. Он также выполняет обычную аутентификацию на Tomcat (Tomcat1, Tomcat2).

Конечный пользователь вызывает URL-адреса вида: http: /// a / b? Username = foo & password = bar & session = xxx

Затем обратный прокси-сервер передает запрос в Apache, отправляя учетные данные как токены базовой аутентификации.

У конечного пользователя есть три разных адреса:

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, а затем он отправляет эту информацию о сеансе как часть запроса (в строка запроса, параметр сеанса)

Чтобы поддерживать состояния сеансов в бэкэнд-котах (tomcat1, tomcat2), обратный прокси-сервер Java получает сеанс из строки запроса и отправляет его прокси-котам в виде файла cookie JSESSIONID.

Все отлично работает для 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

Как видите, даже несмотря на то, что файл cookie JSESSIONID такой же, Apache отправляет запрос не тому коту (здесь tomcat1).

Может ли быть дело в том, что url для service3 не требует аутентификации Auth Basic, в отличие от service1 и service2?

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

Мы очень ценим вашу помощь.

Спасибо

14
задан benjamin.d 22 February 2012 в 10:35
поделиться