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

Apache作为反向代理和负载平衡器需要使用粘性会话,apache,tomcat,load-balancing,reverse-proxy,sticky-session,Apache,Tomcat,Load Balancing,Reverse Proxy,Sticky Session,我在集群(使用pacemaker)中有两个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

我在集群(使用pacemaker)中有两个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>

代理主机
平衡员http://192.168.1.101:8080/ 路由=server01 keepalive=On ping=5最大值=200 ttl=120
平衡员http://192.168.1.102:8080/ route=server02 keepalive=On ping=5最大值=200 ttl=120
ProxySet stickysession=JSSessionID | JSSessionID lbmethod=byrequests timeout=60
代理通过/服务器状态!
ProxyPass/MyWebApp/balancer://myClusterBalancer/MyWebApp/ stickysession=JSSessionId | JSSessionId scolonpathdelim=On
ProxyPassReverse/MyWebApp/balancer://myClusterBalancer/MyWebApp/
ProxyPass/balancer://myClusterBalancer/MikiFax/ stickysession=JSSessionId | JSSessionId scolonpathdelim=On
ProxyPassReverse/balancer://myClusterBalancer/MyWebApp/
以及Node1和Node2的Tomcat server.xml vim/opt/tomcat/conf/server.xml

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

我的系统是这样工作的:

  • HTTP请求给VIP,我收到Apace的回复
  • 快速将请求转发给两个Tomcat中的一个作为反向代理和负载平衡器
  • 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>
    
    
    
    当我点击它的时候,我会打开一个新的标签 第二链接:

    <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>
    
    
    
    当我加载页面时(单击第一个链接后),该文件保存在服务器上,如果单击该链接,我将在“新建”选项卡中打开该文件,但有时另一台服务器会处理该请求,我收到一个错误,因为在第二台服务器上未下载该文件

    我如何解决这个问题?
    谢谢你的更新。

    I解决了它

    修改Server1的Tomcat server.xml

    <Engine name="Catalina" defaultHost="localhost" jvmRoute="server01">
    
    
    
    修改Server2的Tomcat server.xml

    <Engine name="Catalina" defaultHost="localhost" jvmRoute="server02">
    
    
    
    修改apacheconf

    <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>
    
    
    代理主机
    标头添加集Cookie“ROUTEID=。%{BALANCER\u WORKER\u ROUTE}e;path=/”env=BALANCER\u ROUTE\u已更改
    平衡员http://192.168.1.101:8080/ 路由=服务器01
    平衡员http://192.168.1.102:8080/ 路由=服务器02
    ProxySet stickysession=ROUTEID
    ProxyPass/MyWebApp/balancer://myClusterBalancer/MyWebApp/
    ProxyPassReverse/MyWebApp/balancer://myClusterBalancer/MyWebApp/
    ProxyPass/balancer://myClusterBalancer/MyWebApp/
    ProxyPassReverse/balancer://myClusterBalancer/MyWebApp/