【问题标题】:Sticky session not working with multiple apache vhosts and multiple JBoss 7.2 server-groups粘性会话不适用于多个 apache vhost 和多个 JBoss 7.2 服务器组
【发布时间】:2015-09-24 17:41:04
【问题描述】:

具有具有以下详细信息的特定集群架构:

  • 负载平衡器 (10.10.0.1) 使用 Apache 的 mod_cluster 1.2.0,不使用多播进行广告
  • 2 个 JBoss AS 7.2 服务器(jboss-instance-1, jboss-instance-1)在域模式(主机和从机),我使用代理列表而不是多播

在 domain.xml 我有以下设置(仅重要的 sn-ps):

    ...
        <subsystem xmlns="urn:jboss:domain:modcluster:1.1">
            <mod-cluster-config advertise-socket="modcluster" connector="ajp" balancer="${mycluster.modcluster.balancer:DefaultBalancer}" proxy-list="10.10.0.1:6677">
                <dynamic-load-provider>
                    <load-metric type="busyness"/>
                </dynamic-load-provider>
            </mod-cluster-config>
        </subsystem>
    ...
    ...
    <server-group name="SG1" profile="ha">
        <system-properties>
            <property name="mycluster.modcluster.balancer" value="SG1Balancer"/>
        </system-properties>
        <jvm name="default"/>
        <socket-binding-group ref="ha-sockets"/>
    </server-group>
    <server-group name="SG2" profile="ha">
        <system-properties>
            <property name="mycluster.modcluster.balancer" value="SG2Balancer"/>
        </system-properties>
        <jvm name="default"/>
        <socket-binding-group ref="ha-sockets"/>
    </server-group>
    ....

在host.xml中(和slave和host一样):

    ....
    <servers>
        <server name="server-1" group="SG1" auto-start="true">
            <socket-bindings port-offset="1"/>
        </server>
        <server name="server-2" group="SG2" auto-start="true">
            <socket-bindings port-offset="2"/>
        </server>
    ....

我需要将每个虚拟主机指向一个特定的服务器组,所以这是我的解决方案:

  • www.vhost1.com -> SG1Balancer,它附加到 group=SG1,因此它将在以下之间进行负载平衡:
    • jboss-instance-1 的 server-1
    • jboss-instance-2 的 server-1
  • www.vhost2.com -> SG2Balancer,它附加到 group=SG2,所以它会在以下之间进行负载均衡:
    • jboss-instance-1 的 server-2
    • jboss-instance-2 的 server-2

这是我的 httpd 配置集:

loadbalancer.conf:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

LoadModule slotmem_module modules/mod_slotmem.so
LoadModule manager_module modules/mod_manager.so
LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
LoadModule advertise_module modules/mod_advertise.so

<IfModule manager_module>
  Listen 0.0.0.0:6677
  ManagerBalancerName ddrct-cluster

  <VirtualHost *:6677>
    ServerName RecetteDtvLb1
    <Location />
      Order deny,allow
      Allow from 0.0.0.0
    </Location>

    # No server advertising
    # we're using proxy-list
    ServerAdvertise Off

    KeepAliveTimeout 300
    MaxKeepAliveRequests 0
    EnableMCPMReceive

    <Location /mcm>
      SetHandler mod_cluster-manager
      Order deny,allow
      Allow from 0.0.0.0
    </Location>
  </VirtualHost>
</IfModule>

vhosts.conf:

ProxyRequests Off
NameVirtualHost *:80

<VirtualHost *:80>
  ServerName www.vhost1.com

  ProxyPass / balancer://SG1Balancer stickysession=JSESSIONID
  ProxyPassReverse / balancer://SG1Balancer
  ProxyPreserveHost On

  ErrorLog "logs/vhost1_error.log"
  CustomLog "logs/vhost1_access.log" common
</VirtualHost>

<VirtualHost *:80>
  ServerName www.vhost2.com

  ProxyPass / balancer://SG2Balancer stickysession=JSESSIONID
  ProxyPassReverse / balancer://SG2Balancer
  ProxyPreserveHost On

  ErrorLog "logs/vhost2_error.log"
  CustomLog "logs/vhost2_access.log" common
</VirtualHost>

一切正常,G1中部署的应用程序可以通过www.vhost1.com使用,反之亦然G2,问题都是关于会话粘性的,以下是症状:

  • 我的浏览器正在接受 JSESSIONID cookie,但有这样的内容:KhH7gInyAFPsILN6mYDQ84Kf.jboss-instance-1:server-1 不会让我的下一个请求粘在 jboss-instance-1 的服务器上 - 1,负载均衡器将在 jboss-instance-1 的 server-1 和 jboss-instance-2 的 server-1 之间切换我的请求,并且每次更改 JSESSIONID cookie 内容。
  • 当我手动编辑 JSESSIONID cookie 的内容(使用 firecookie 插件)以删除服务器名称时:KhH7gInyAFPsILN6mYDQ84Kf.jboss-instance-1,我的请求将停留在 jboss-instance- 1,导致正确的行为

没有得到太多关于多虚拟主机和多服务器组集群和负载平衡配置的文档,实现这样的配置是我自己的猜测,我可能弄错了......有什么帮助吗?

【问题讨论】:

    标签: apache jboss load-balancing jsessionid mod-cluster


    【解决方案1】:

    问题已解决,来自KB182813

    • 请勿在平衡器名称中添加“-”字符,因为已知它会产生粘性会话问题
    • 请勿在平衡器名称中使用大写字符

    【讨论】:

    • 我们真的需要 ProxyPassReverse 指令来从客户端浏览器访问服务吗?我希望,不需要。只是为了好奇,它会有什么帮助?
    【解决方案2】:

    关于节点名称
    相关问题 MODCLUSTER-435 已于 2014 年 11 月解决。在任何合适的 mod_cluster 版本中使用大写字符和破折号是安全的,即1.3.x

    关于 ProxyPass
    除非想要做一些特别的事情,否则不需要设置任何与 ProxyPass 相关的东西。上述设置是多余的和奇怪的。 Mod_cluster 使用 mod_proxy 作为其后端,因此它实际上为您动态配置代理通道平衡器成员。如果您希望以自定义方式更改平衡器的行为,则拥有自己的 ProxyPass 附加设置是有意义的,例如

    • 需要从 Apache HTTP 服务器提供静态内容,同时将动态内容代理给 Wildfly 工作人员: ProxyPassMatch ^/app/static/ ! ProxyPass /app balancer://qacluster stickysession=JSESSIONID|jsessionid nofailover=on ProxyPass / ! ProxyPassReverse /app balancer://qacluster ProxyPassReverseCookieDomain / /app/ ProxyPassReverseCookiePath / /app/ ProxyPreserveHost on

    【讨论】:

      猜你喜欢
      • 2022-06-12
      • 2011-08-26
      • 1970-01-01
      • 2013-04-16
      • 2014-05-03
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 2014-12-13
      相关资源
      最近更新 更多