Apache作为反向代理和负载均衡器需要使用粘性会话

问题描述

我在群集中有两个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://192.168.1.100/MyWebApp上向VIP发送HTTP请求,我收到了Apace的回复
  2. 将请求转发到两个Tomcat中的一个作为反向代理和负载平衡器
  3. Tomcat发送http响应

现在在Tomcat的页面上,我具有不同的链接,当我单击此链接(打开一个标签)时,我需要使用同一台Tomcat服务器。

链接的格式如下:

一个链接

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

当我单击它时,我会打开一个标签 第二链接

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

加载页面时(单击第一个链接后),此文件保存在服务器上;如果单击链接,则在新选项卡中打开文件,但有时此请求由另一台服务器处理并且收到错误消息,因为未在第二台服务器上下载此文件

如何解决此问题? 感谢您的更新。

解决方法

解决了

为Server1修改Tomcat server.xml

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

为Server2修改Tomcat server.xml

<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>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...