Proxy

用於多個虛擬主機的單個平衡器管理器頁面

  • February 17, 2014

我們目前使用 Apache 2.4作為負載均衡器,用於由三個 Tomcat 伺服器組成的多主集群。我們可以使用 Web 瀏覽器訪問此負載均衡器的內部 IP 地址並即時更改設置(例如*http://xx.xx.xx.xx/balancer-manager*)。這行得通,我們對此非常滿意。

啟用的模組:

  • proxy.load(proxy.conf用來配置)
  • proxy_ajp.load
  • proxy_balancer.load(proxy_balancer.conf用來配置)

但是現在我們將在這個 Apache 上託管幾個(在這個設置中是三個)虛擬主機,每個虛擬主機代表一個由三個 Tomcat 本身組成的集群。每個都可以通過一個 URL 訪問,比如*http://customer.company.tld/app/ui*)。所以每個集群的路徑都是一樣的!現在我們面臨兩個問題:

  • page balancer-manager只能通過它的虛擬主機訪問。因此,我們必須通過隨機選擇的內部主機名(添加到 ServerAlias)來訪問平衡器管理器,並將這個主機名也添加到我們內部電腦的*/etc/hosts*中,以便能夠使用它。
  • 此外,我們必須為每個虛擬主機(~cluster)執行此操作。但是我們想要一個單頁平衡器管理器,它顯示所有虛擬主機和後面的集群。

這裡有一些範例配置:

/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 中配置了平衡,這應該允許通過內部 IP 訪問並在單個頁面上顯示所有集群和集群成員。但這將不再起作用,代理的配置似乎只接受路徑(例如appapp_service)而不是 URL 或主機名。我們不能也不會改變路徑。因此,我們將代理配置移動到虛擬主機中。

謝謝你的幫助!

拆分配置怎麼樣。將平衡器定義放在任何虛擬主機之外並刪除上下文:

    <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

要訪問您的平衡器管理器,請在其中創建一個額外的管理虛擬主機 <Location /balancer-manager>

這樣,您就有了一個定義所有平衡器的地方和一個用於訪問平衡器管理器的虛擬主機,該平衡器管理器向您顯示所有平衡器。

引用自:https://serverfault.com/questions/573340