липкая сессия с веб-сервером Apache и серверами Tomcat - PullRequest
17 голосов
/ 16 мая 2011

Я использую веб-сервер apache в качестве балансировщика нагрузки для двух экземпляров tomcat, стоящих за apache.Когда первый запрос идет к узлу A, а второй запрос от того же клиента идет к узлу B, я не могу получить доступ к переменным сеанса в узле A. Это очевидно.Я занимался серфингом в интернете и обнаружил, что включение липких сессий поможет.Но все учебники по включению липких сессий в Apache выглядят запутанно.Есть ли простой пошаговый учебник для этого?Пожалуйста, помогите.

Фрагмент кода из комментария:

ProxyPass /balancer-manager ! 
ProxyPass /balancer://mycluster/ stickysession=JSESSIONID 
ProxyPassReverse /balancer://mycluster/ 
<Proxy balancer://mycluster>; 
  BalancerMember ajp://localhost:9001/ route=NodeA1000 retry=10 
  BalancerMember ajp://localhost:9002/ route=NodeB1000 retry=10 
</Proxy> 

Ответы [ 5 ]

16 голосов
/ 31 марта 2012

Это сработало для меня ...

Вместо использования stickysession = JSESSIONID в директиве ProxyPass его необходимо установить в конфигурации балансировщика с помощью ProxySet stickysession = JSESSIONID:

<Proxy balancer://mybalancer>
BalancerMember ajp://server1:8009 route=tomcat1
BalancerMember ajp://server2:8009 route=tomcat2
ProxySet lbmethod=bytraffic
ProxySet stickysession=JSESSIONID
</Proxy>
ProxyPass /myapp/ mybalancer://myapp/

Это было , не работало для меня, когда я использовал его в ProxyPass, как показано ниже:

ProxyPass /myapp/ mybalancer://myapp/ stickysession=JSESSIONID

Это должно быть добавлено в Apache Docs, потому что это такая проблема, чтобы решить.

11 голосов
/ 16 мая 2011

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

Если вы используете директиву ProxyPass, используйте

ProxyPass /example http://backend.example.com stickysession=JSESSIONID

Можно найти в превосходной документации Apache httpd .

6 голосов
/ 31 июля 2014

Пожалуйста, попробуйте это, я уверен, что это будет работать для вас.

Шаг 1: добавьте следующий код в httpd.conf:

<Proxy balancer://mycluster>
BalancerMember http://<NODE1>/<APP>/  route=jvm1 
BalancerMember http://<NODE2>/<APP>/  route=jvm2
ProxySet lbmethod=bytraffic
ProxySet stickysession=JSESSIONID
</Proxy>

ProxyPass /<APP>/ balancer://mycluster/ 
ProxyPassReverse /<APP>/ balancer://mycluster/

Шаг 2: Добавьте приведенный ниже код в server.conf:

a) <NODE1>
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">    
b) <NODE2>
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm2">
2 голосов
/ 04 мая 2012

С этой проблемой я тоже столкнулся - если вы определяете свой балансировщик в vhost, то, похоже, он использует stickysession, как описано в документации.Однако, если вы определяете балансировщик вне vhost, в котором он используется, то stickysession теряется, поэтому вы должны установить его с помощью ProxySet внутри самого балансировщика.

0 голосов
/ 15 января 2014

Я думаю, что ваша проблема в том, что вы используете mybalancer, где вы используете балансировщик:

ProxyPass /myapp/ balancer://mybalancer/ stickysession=JSESSIONID
...