我们目前使用Apache 2.4作为负载平衡器,用于三台Tomcat服务器的多主集群。 我们可以通过networking浏览器访问这个负载均衡器的内部IP地址,并可以随时更改设置(例如http://xx.xx.xx.xx/balancer-manager )。 这工作,我们对此很好。
启用的模块:
但是现在我们将在这个Apache上托pipe几个虚拟主机(在这个设置中是三个虚拟主机),每个虚拟主机代表一个三个Tomcat本身的集群。 每个都可以通过一个像http://customer.company.tld/app/ui这样的URL来访问 。 所以每个集群的path是一样的 ! 现在我们面临着两个问题:
这里有一些示例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 (例如app和app_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。 无需在客户端和负载平衡器上使用/ etc / hosts进行破解。 缺点,特别是在Apache 2.4上,界面变得很混乱,你必须滚动很多。