Липкий сеанс с сервером apache и серверами tomcat
Я использую веб-сервер Apache как балансировщик нагрузки для двух экземпляров tomcat за apache. Когда первый запрос отправляется на node A, а второй запрос от того же клиента переходит на node B, я могу использовать переменные сеанса доступа в node 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>
Ответы
Ответ 1
Для apache httpd, чтобы ваши сессии были привязаны к одному и тому же серверу, ему необходимо знать, какой файл cookie хранит идентификатор сеанса. Для java это (обычно) JSESSIONID.
Если вы используете директиву ProxyPass
, используйте
ProxyPass /example http://backend.example.com stickysession=JSESSIONID
В отличная документация apache httpd.
Ответ 2
Это сработало для меня...
Вместо использования 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, потому что это так больно решить.
Ответ 3
Попробуйте это, я уверен, что это сработает для вас.
Шаг-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">
Ответ 4
Это проблема, с которой я столкнулся - если вы определяете свой балансир в пределах vhost, то, похоже, он использует stickysession как задокументированный. Однако, если вы определяете балансировку за пределами vhost, в которой она используется, тогда лизание теряется, поэтому вы должны установить его с помощью ProxySet внутри самого балансира.
Ответ 5
Я думаю, ваша проблема в том, что вы используете mybalancer, где вы используете балансировку:
ProxyPass /myapp/ balancer://mybalancer/ stickysession=JSESSIONID