一个单一的平衡器pipe理器页面为多个虚拟主机

我们目前使用Apache 2.4作为负载平衡器,用于三台Tomcat服务器的多主集群。 我们可以通过networking浏览器访问这个负载均衡器的内部IP地址,并可以随时更改设置(例如http://xx.xx.xx.xx/balancer-manager )。 这工作,我们对此很好。

启用的模块:

  • proxy.load(用于configurationproxy.conf)
  • proxy_ajp.load
  • proxy_balancer.load(用于configurationproxy_balancer.conf)

但是现在我们将在这个Apache上托pipe几个虚拟主机(在这个设置中是三个虚拟主机),每个虚拟主机代表一个三个Tomcat本身的集群。 每个都可以通过一个像http://customer.company.tld/app/ui这样的URL来访问 。 所以每个集群path是一样的 ! 现在我们面临着两个问题:

  • 页面平衡器pipe理器只能通过虚拟主机访问。 因此,我们必须通过随机select内部主机名(添加到ServerAlias)来访问平衡器pipe理器,并将该主机名也添加到离我们内部计算机的/ etc / hosts中以便能够使用它。
  • 此外,我们必须为每个虚拟主机(〜集群)执行此操作。 但是我们希望有一个页面平衡器pipe理器来显示所有的虚拟主机和后面的集群。

这里有一些示例configuration:
/ etc / apache2 / site-enabled / foo #我们其实有三个:foo,bar,baz

<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName customer-foo.company.tld ServerAlias customer-foo-balancer customer-foo.company.tld www.customer-foo.company.tld DocumentRoot /var/www <Directory /> Options FollowSymLinks AllowOverride None Order allow,deny deny from all </Directory> <Directory /var/app/app_static> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> <Directory /var/www/app_static_res> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> # load balancer <Location /balancer-manager> SetHandler balancer-manager Order deny,allow Deny from all # allows for internal access Allow from 127.0.0.1 ::1 10.1.21.81 10.1.4.9 Satisfy all </Location> ProxyRequests Off ProxyVia Off ProxyPreserveHost On <Proxy balancer://htg> ProxySet failonstatus=503 BalancerMember ajp://10.171.23.120:8010/app lbset=0 route=foo001 loadfactor=40 BalancerMember ajp://10.171.23.121:8010/app lbset=0 route=foo002 loadfactor=40 BalancerMember ajp://10.171.23.122:8010/app lbset=0 route=foo003 loadfactor=20 </Proxy> <Proxy balancer://htgservice> ProxySet failonstatus=503 BalancerMember ajp://10.171.23.120:8011/wcs_service route=foo001 loadfactor=40 BalancerMember ajp://10.171.23.121:8011/wcs_service route=foo002 loadfactor=40 BalancerMember ajp://10.171.23.122:8011/wcs_service route=foo003 loadfactor=20 </Proxy> ProxyPass /app balancer://foo stickysession=JSESSIONID|jsessionid nofailover=Off scolonpathdelim=On ProxyPassReverse /app balancer://foo ProxyPass /app_service balancer://fooservice stickysession=JSESSIONID|jsessionid nofailover=Off scolonpathdelim=On ProxyPassReverse /app_service balancer://fooservice LogLevel warn ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> 

在过去,我们在独立文件proxy.conf和proxy_balancer.conf中configuration了平衡,这应该允许通过内部IP访问并在单个页面上显示所有群集和群集成员。 但是这不会工作了,代理configuration似乎只接受path (例如appapp_service )而不是URL或主机名。 我们不能也不会改变path。 所以我们把代理configuration移到了虚拟主机里面。

谢谢你的帮助!

怎么样分裂你的configuration。 将您的平衡器定义放置在任何虚拟主机的外部并删除上下文:

  <Proxy balancer://htg> ProxySet failonstatus=503 BalancerMember ajp://10.171.23.120:8010 lbset=0 route=foo001 loadfactor=40 BalancerMember ajp://10.171.23.121:8010 lbset=0 route=foo002 loadfactor=40 BalancerMember ajp://10.171.23.122:8010 lbset=0 route=foo003 loadfactor=20 </Proxy> <Proxy balancer://htgservice> ProxySet failonstatus=503 BalancerMember ajp://10.171.23.120:8011 route=foo001 loadfactor=40 BalancerMember ajp://10.171.23.121:8011 route=foo002 loadfactor=40 BalancerMember ajp://10.171.23.122:8011 route=foo003 loadfactor=20 </Proxy> 

在你的虚拟主机中引用这些平衡器:

 ProxyPass /app balancer://htg/app stickysession=JSESSIONID|jsessionid nofailover=Off scolonpathdelim=On ProxyPassReverse /app balancer://htg/app ProxyPass /app_service balancer://htgservice/wtg_service stickysession=JSESSIONID|jsessionid nofailover=Off scolonpathdelim=On ProxyPassReverse /app_service balancer://htgservice/wtg_service 

要访问您的平衡器pipe理器,请使用<Location /balancer-manager>创build一个额外的pipe理虚拟主机。

通过这种方式,您可以在一个地方定义所有的平衡器,一个虚拟机可以访问平衡器pipe理器,向您显示所有的平衡器。

谢谢基督徒! 基督徒的解决scheme是正确的!

基本上你必须把ProxyPass和ProxyPassReverse放在虚拟主机的configuration中,然后在proxy.conf中定义Proxy-Directive。 正如Christian在他自己的评论中所说的那样,它需要使用Proxy-Directive中的ProxySet -Directive来configurationStickySession – 它不能与ProxyPass一起使用。 波纹pipe是一个简短但完整的例子:

VirtualHost示例(一个用于foo,bar,baz):

 <VirtualHost *:80> ServerAdmin webmaster@localhost ServerName customer-foo.company.tld ServerAlias customer-foo-balancer customer-foo.company.tld www.customer-foo.company.tld DocumentRoot /var/www/foo <Directory /> Options FollowSymLinks AllowOverride None Order allow,deny deny from all </Directory> <Directory /var/www/foo/wcs_static> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> <Directory /var/www/foo/wcs_static_res> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> # maintenance RewriteEngine On RewriteCond %{DOCUMENT_ROOT}/wcs_static_res/maintenance.html -f RewriteCond %{REQUEST_FILENAME} !/wcs_static_res/maintenance.html RewriteCond %{REQUEST_FILENAME} !/wcs_static_res/maintenance-time.png RewriteCond %{REMOTE_HOST} !^10\.1\.0\.203 RewriteRule ^.*$ /wcs_static_res/maintenance.html [L] # redirect, SSL itself is handled by another server in front of this loadbalancer RedirectMatch (.*)/$ https://customer-foo.company.tld/wcs/ui # load balancer # web-frontend ProxyPass /wcs balancer://foo # stickysession can't be set with ProxyPass in this case, see proxy.conf ProxyPassReverse /wcs balancer://foo # standalone-clients ProxyPass /wcs_service balancer://fooservice ProxyPassReverse /wcs_service balancer://fooservice # logging LogLevel warn ErrorLog ${APACHE_LOG_DIR}/foo_error.log CustomLog ${APACHE_LOG_DIR}/foo_access.log combined </VirtualHost> 

proxy.conf(只有这个):

 <IfModule mod_proxy.c> ProxyRequests Off ProxyVia Off ProxyPreserveHost On <Proxy balancer://foo> # stickysessions must be defined here ProxySet failonstatus=503 stickysession=JSESSIONID|jsessionid nofailover=Off scolonpathdelim=On BalancerMember ajp://10.171.23.120:8010/wcs lbset=0 route=foo001 loadfactor=40 BalancerMember ajp://10.171.23.121:8010/wcs lbset=0 route=foo002 loadfactor=40 BalancerMember ajp://10.171.23.122:8010/wcs lbset=0 route=foo003 loadfactor=20 </Proxy> <Proxy balancer://fooservice> ProxySet failonstatus=503 stickysession=JSESSIONID|jsessionid nofailover=Off scolonpathdelim=On BalancerMember ajp://10.171.23.120:8011/wcs_service route=foo001 loadfactor=40 BalancerMember ajp://10.171.23.121:8011/wcs_service route=foo002 loadfactor=40 BalancerMember ajp://10.171.23.122:8011/wcs_service route=foo003 loadfactor=20 </Proxy> <Proxy balancer://bar> ProxySet failonstatus=503 stickysession=JSESSIONID|jsessionid nofailover=Off scolonpathdelim=On BalancerMember ajp://10.171.21.110:8010/wcs lbset=0 route=bar001 loadfactor=40 BalancerMember ajp://10.171.21.111:8010/wcs lbset=0 route=bar002 loadfactor=40 BalancerMember ajp://10.171.21.112:8010/wcs lbset=0 route=bar003 loadfactor=20 </Proxy> <Proxy balancer://barservice> ProxySet failonstatus=503 stickysession=JSESSIONID|jsessionid nofailover=Off scolonpathdelim=On BalancerMember ajp://10.171.21.110:8011/wcs_service route=bar001 loadfactor=40 BalancerMember ajp://10.171.21.111:8011/wcs_service route=bar002 loadfactor=40 BalancerMember ajp://10.171.21.112:8011/wcs_service route=bar003 loadfactor=20 </Proxy> <Proxy balancer://baz> ProxySet failonstatus=503 stickysession=JSESSIONID|jsessionid nofailover=Off scolonpathdelim=On BalancerMember ajp://10.171.45.100:8010/wcs lbset=0 route=baz001 loadfactor=40 BalancerMember ajp://10.171.45.101:8010/wcs lbset=0 route=baz002 loadfactor=40 BalancerMember ajp://10.171.45.102:8010/wcs lbset=0 route=baz003 loadfactor=20 </Proxy> <Proxy balancer://bazservice> ProxySet failonstatus=503 stickysession=JSESSIONID|jsessionid nofailover=Off scolonpathdelim=On BalancerMember ajp://10.171.45.100:8011/wcs_service route=baz001 loadfactor=40 BalancerMember ajp://10.171.45.101:8011/wcs_service route=baz002 loadfactor=40 BalancerMember ajp://10.171.45.102:8011/wcs_service route=baz003 loadfactor=20 </Proxy> </IfModule> 

proxy_balancer.conf:

 <IfModule mod_proxy_balancer.c> <IfModule mod_status.c> <Location /balancer-manager> SetHandler balancer-manager Order deny,allow Deny from all # store here your internal IPs for direct access Allow from 127.0.0.1 ::1 Satisfy all </Location> </IfModule> 

现在,您可以通过http://ipofloadbalancer.com/balancer-manager更改您代理后面的所有服务器的configuration&#x3002; 无需在客户端和负载平衡器上使用/ etc / hosts进行破解。 缺点,特别是在Apache 2.4上,界面变得很混乱,你必须滚动很多。