粘性会话不适用于多个apache vHost和多个JBoss 7.2服务器组

粘性会话不适用于多个apache vHost和多个JBoss 7.2服务器组,apache,jboss,load-balancing,jsessionid,mod-cluster,Apache,Jboss,Load Balancing,Jsessionid,Mod Cluster,具有特定的群集体系结构,并具有以下详细信息: 负载平衡器(10.10.0.1),使用Apache的mod_cluster 1.2.0,不使用多播进行广告 2个JBoss作为7.2服务器(JBoss-instance-1,JBoss-instance-1)在域模式下(主机和从机),我使用代理列表而不是多播 在domain.xml中,我有以下设置(仅重要片段): 。。。 ... ... .... 在host.xml中(与从机和主机中相同): 。。。。 .... 我需要将每个虚拟主机指向特定的

具有特定的群集体系结构,并具有以下详细信息:

  • 负载平衡器(10.10.0.1),使用Apache的mod_cluster 1.2.0,不使用多播进行广告
  • 2个JBoss作为7.2服务器(JBoss-instance-1,JBoss-instance-1)在域模式下(主机和从机),我使用代理列表而不是多播
在domain.xml中,我有以下设置(仅重要片段):

。。。
...
...
....
在host.xml中(与从机和主机中相同):

。。。。
....
我需要将每个虚拟主机指向特定的服务器组,因此这是我的解决方案:

  • www.vhost1.com->SG1Balancer,它连接到group=SG1,因此它将在以下各项之间进行负载平衡:
    • jboss-instance-1的服务器-1
    • jboss-instance-2的服务器-1
  • www.vhost2.com->SG2Balancer,它连接到group=SG2,因此它将在以下各项之间进行负载平衡:
    • jboss-instance-1的服务器-2
    • jboss-instance-2的服务器-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>
LoadModule proxy\u modules/mod\u proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule slotmem\u module modules/mod\u slotmem.so
LoadModule manager\u module modules/mod\u manager.so
LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
LoadModule advertive\u modules/mod\u advertive.so
听0.0.0.0:6677
ManagerBalancerName ddrct群集
服务器名已接收到VLB1
命令拒绝,允许
允许从0.0.0.0开始
#没有服务器广告
#我们正在使用代理列表
服务器广告关闭
保持超时300
MaxKeepAliverRequests 0
启用接收
SetHandler mod_群集管理器
命令拒绝,允许
允许从0.0.0.0开始
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>
ProxyRequests关闭
名称虚拟主机*:80
服务器名www.vhost1.com
ProxyPass/balancer://SG1Balancer stickysession=jsSessionId
ProxyPassReverse/balancer://SG1Balancer
代理主机
ErrorLog“logs/vhost1_error.log”
CustomLog“logs/vhost1_access.log”通用
服务器名www.vhost2.com
ProxyPass/balancer://SG2Balancer stickysession=jsSessionId
ProxyPassReverse/balancer://SG2Balancer
代理主机
ErrorLog“logs/vhost2_error.log”
CustomLog“logs/vhost2_access.log”通用
一切正常,在G1中部署的应用程序可以通过www.vhost1.com使用,反之亦然,对于G2,问题在于会话粘性,以下是症状:

  • 我的浏览器正在接受JSESSIONID cookie,但其内容如下:KhH7gInyAFPsILN6mYDQ84Kf.jboss-instance-1:server-1不会将我的下一个请求粘贴到jboss-instance-1的server-1,负载平衡器将在jboss-instance-1的server-1和jboss-instance-2的server-1之间切换我的请求,每次它都会更改JSESSIONID cookie内容
  • 当我手动编辑JSESSIONID cookie的内容(使用firecookie插件)以删除如下服务器名称时:KhH7gInyAFPsILN6mYDQ84Kf.jboss-instance-1,我的请求将粘附在jboss-instance-1上,从而导致正确的行为
没有得到太多关于多vhost和多服务器组集群和负载平衡配置的文档,这是我自己的猜测来实现这样的配置,我可能会弄错。。。有任何帮助吗?

问题已解决,来自:

  • 不要将“-”字符放在平衡器名称中,因为众所周知,它会造成棘手的会话问题
  • 不要在平衡器名称中使用大写字符

关于节点名称
相关问题于2014年11月得到解决。在任何合适的mod_集群版本中使用大写字符和破折号都是安全的,例如

关于ProxyPass
除非您想做一些特殊的事情,否则不需要设置任何与ProxyPass相关的内容。前面提到的设置是多余的和奇怪的。Mod_集群使用Mod_代理作为其后端,因此它实际上为您动态配置代理传递平衡器成员。如果您希望以自定义方式更改平衡器的行为,则有必要使用自己的ProxyPass附加设置,例如:

  • 当动态内容代理给Wildfly workers时,需要从Apache HTTP服务器提供静态内容:
    
    ProxyPassMatch^/app/static/!
    ProxyPass/appbalancer://qacluster stickysession=JSSessionId | JSSessionId nofailover=on
    ProxyPass/!
    ProxyPassReverse/appbalancer://qacluster
    ProxyPassReverseCookieDomain//app/
    ProxyPassReverseCookiePath//app/
    ProxyPreserveHost打开

我们真的需要ProxyPassReverse指令才能从客户端浏览器访问服务吗?我希望,这是不必要的。只是出于好奇,这会有什么帮助?
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>
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>