Apache в качестве обратного прокси-сервера и балансировщика нагрузки должен использовать sticky session

#apache #tomcat #load-balancing #reverse-proxy #sticky-session

#apache #tomcat #балансировка нагрузки #обратный прокси #sticky-сессия

Вопрос:

У меня есть два узла CentOS 8 (192.168.1.101 и 192.168.1.102) в кластере (с использованием кардиостимулятора), где я настроил VIP (192.168.1.100) и Apache в качестве ресурсов кластера. На всех узлах установлены Apache 2.4 и Tomcat 9

Конфигурация для Apache такова: vim /etc/httpd/conf/httpd.conf

 <VirtualHost *:80>
        ProxyPreserveHost On

        <Proxy balancer://myClusterBalancer>
             BalancerMember http://192.168.1.101:8080/ route=server01 keepalive=On ping=5 max=200 ttl=120
             BalancerMember http://192.168.1.102:8080/ route=server02 keepalive=On ping=5 max=200 ttl=120
             ProxySet stickysession=JSESSIONID|jsessionid lbmethod=byrequests timeout=60
        </Proxy>

        ProxyPass /server-status !
        ProxyPass /MyWebApp/  balancer://myClusterBalancer/MyWebApp/ stickysession=JSESSIONID|jsessionid scolonpathdelim=On
        ProxyPassReverse /MyWebApp/  balancer://myClusterBalancer/MyWebApp/

        ProxyPass / balancer://myClusterBalancer/MikiFax/ stickysession=JSESSIONID|jsessionid scolonpathdelim=On
        ProxyPassReverse / balancer://myClusterBalancer/MyWebApp/
</VirtualHost>
  

и мой Tomcat server.xml для Node1 и Node2
vim /opt/tomcat/conf/server.xml

 <Engine name="Catalina" defaultHost="localhost" jvmRoute="server01">
<Engine name="Catalina" defaultHost="localhost" jvmRoute="server02">
  

Моя система работает таким образом:

  1. HTTP-запрос к VIP наhttp://192.168.1.100/MyWebApp и я получаю ответ от Apace;
  2. Быстро перешлите запрос одному из двух Tomcat в качестве обратного прокси и балансировщика нагрузки
  3. Tomcat отправляет HTTP-ответ

Теперь на странице Tomcat у меня другая ссылка, и мне нужно, когда я нажимаю на эту ссылку (открываю новую вкладку) Я должен использовать тот же сервер Tomcat.

Ссылка в этом формате:

Первая ссылка:

 <a target="_blank" href="http://192.168.1.100/MyWebApp/F?URL=1599825050056amp;amp;viewAttach=Y">CLICK FOR DETAILS</a>
  

Когда я нажимаю на него, я открываю новую вкладку с этим
Вторая ссылка:

 <a href="attachmentsmyAttachment.pdf" target="_blank">myAttachment.pdf</a>
  

этот файл сохраняется на сервере при загрузке страницы (после того, как я нажимаю на первую ссылку), и если я нажимаю на ссылку, я открываю файл в новой вкладке, но иногда этот запрос обрабатывается другим сервером, и я получаю сообщение об ошибке, потому что на втором сервере этот файл не был загружен.

Как я могу решить эту проблему? Спасибо за обновление.

Ответ №1:

Я решил это.

Изменить Tomcat server.xml для Server1

 <Engine name="Catalina" defaultHost="localhost" jvmRoute="server01">
  

Изменить Tomcat server.xml для Server2

 <Engine name="Catalina" defaultHost="localhost" jvmRoute="server02">
  

Измените Apache conf

 <VirtualHost *:80>
        ProxyPreserveHost On
        Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
    
        <Proxy balancer://myClusterBalancer>
            BalancerMember http://192.168.1.101:8080/ route=server01
            BalancerMember http://192.168.1.102:8080/ route=server02
            ProxySet stickysession=ROUTEID
        </Proxy>
        
        ProxyPass /MyWebApp/  balancer://myClusterBalancer/MyWebApp/
        ProxyPassReverse /MyWebApp/  balancer://myClusterBalancer/MyWebApp/
        
        ProxyPass / balancer://myClusterBalancer/MyWebApp/
        ProxyPassReverse / balancer://myClusterBalancer/MyWebApp/
    </VirtualHost>