【高可用HA】Apache (3) —— Mac下配置Apache Httpd負載均衡(Load Balancer)之mod_proxy

Richaaaard發表於2015-12-09

Mac下配置Apache Httpd負載均衡(Load Balancer)之mod_proxy


httpd版本: httpd-2.4.17

參考來源:

Apache (1) —— Mac下安裝Apache Httpd到自定義路徑(非/etc/apache2)

Apache (2) —— Mac 下安裝多個Apache Tomcat例項

Apache httpd mod_proxy

Apache httpd mod_proxy_ajp

Apache負載均衡配置

Apache學習之二、HTTPD的負載均衡

Apache配置反向代理、負載均衡和叢集(mod_proxy方式)

準備

首先我們參照下面兩篇文章配置好httpd和兩個Tomcat例項

其中Tomcat的兩個例項node-a和node-b分別存放與"./servers/cluster/tomcat/node-a"和"/servers/cluster/tomcat/node-b"下

對應的配置分別為:

  • Server Port: 8015 與 8025
  • Connector: 8081 與 8082
  • AJP: 8019 與 8029

另分別為連個例項新增jvmRoute的配置

  • node-a

      <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
  • node-b

      <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
注意:不要忘記修改供測試的頁面特徵

配置httpd負載均衡(Load Balancer)

httpd負載均衡Tomcat的方式主要可以分為兩類

  1. httpd自帶的mod_proxy
  2. Tomcat提供了專門的JK外掛來負責Tomcat和HTTP伺服器的通訊mod_jk
*注意 本篇文章主要關注第一類配置

mod_proxy的兩種實現

  1. http方式
  2. ajp方式

1. mod_proxy使用http方式實現負載均衡

  • 載入mod_proxy的so庫

我們在"./servers/cluster/httpd/node-a/conf/"下修改httpd.conf檔案

配置http balancer
<Proxy balancer://mycluster>  
    BalancerMember http://127.0.0.1:8081 loadfactor=3  
    BalancerMember http://127.0.0.1:8082 loadfactor=3  
    ProxySet lbmethod=byrequests 
</Proxy>  
ProxyRequests Off  
ProxyPass /test balancer://mycluster/ stickysession=JSESSIONID nofailover=Off  
ProxyPassReverse /test balancer://mycluster/
開啟so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
啟動httpd
$ ./bin/httpd -f /Users/Richard/Documents/Dev/servers/cluster/httpd/node-a/conf/httpd.conf -k start
AH00526: Syntax error on line 515 of /Users/Richard/Documents/Dev/servers/cluster/httpd/node-a/conf/httpd.conf:
ProxySet: unknown lbmethod lbmethod=byrequests; balancer://mycluster    

在Terminal中出現錯誤提示"unknown lbmethod lbmethod=byrequests"

發現忘記配置lbmethod相關模組(如果只使用byrequests方式,可以按需開啟以下模組)

LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
修改後重啟Tomcat

發現仍然無法正常訪問,在"./node-a/log/error_log"中出現錯誤提示

[Tue Dec 08 17:16:13.028078 2015] [proxy_balancer:emerg] [pid 10235:tid 140735135085312] AH01177: Failed to lookup provider 'shm' for 'slotmem': is mod_slotmem_shm loaded??
[Tue Dec 08 17:16:13.028176 2015] [:emerg] [pid 10235:tid 140735135085312] AH00020: Configuration Failed, exiting

仍有模組沒有配置

LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
修改後重啟Tomcat

通過瀏覽器訪問

http://localhost:81/test

【高可用HA】Apache (3) —— Mac下配置Apache Httpd負載均衡(Load Balancer)之mod_proxy

【高可用HA】Apache (3) —— Mac下配置Apache Httpd負載均衡(Load Balancer)之mod_proxy

重新整理瀏覽器我們會發現下面兩句話會交替出現

If you're seeing this, you've successfully installed Tomcat. Congratulations! Node - A!!

.

"If you're seeing this, you've successfully installed Tomcat. Congratulations! Node - B!!"

2. mod_proxy使用ajp方式實現負載均衡

配置ajp balancer

將之前的http配置註解掉,加入一下配置

<Proxy balancer://mycluster>  
    BalancerMember ajp://127.0.0.1:8019 loadfactor=2 route=tomcat1  
    BalancerMember ajp://127.0.0.1:8029 loadfactor=2 route=tomcat2  
ProxySet lbmethod=byrequests  
</Proxy>  
ProxyRequests Off  
ProxyPass /test balancer://mycluster/ stickysession=JSESSIONID nofailover=Off  
ProxyPassReverse /test balancer://mycluster/   

需要開啟ajp相關模組

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
重啟Tomcat

用瀏覽器訪問出現錯誤

【高可用HA】Apache (3) —— Mac下配置Apache Httpd負載均衡(Load Balancer)之mod_proxy

檢視error_log

[Wed Dec 09 08:45:34.824060 2015] [proxy:warn] [pid 10582:tid 4338487296] [client ::1:54735] 
AH01144: No protocol handler was valid for the URL /test. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.   

這是因為ajp的底層是依賴TCP的。

檢視httpd Apache官網上關於mod_proxy_ajp的相關說明

The AJP13 protocol is packet-oriented. A binary format was presumably chosen over the more readable plain text for reasons of performance. The web server communicates with the servlet container over TCP connections. To cut down on the expensive process of socket creation, the web server will attempt to maintain persistent TCP connections to the servlet container, and to reuse a connection for multiple request/response cycles.

最後我們為這個httpd的Load Balancer配置一個管理器——Load Balancer Manager

在httpd.conf中,增加配置

<Location /balancer-manager>
    SetHandler balancer-manager

    #Order Deny,Allow
    #Deny from all
    #Allow from .example.com
    Order Deny,Allow
    Allow from all
</Location>

同時將Proxy Cluster的配置修改成

<Proxy balancer://mycluster>  
    BalancerMember http://127.0.0.1:8081 loadfactor=3  
    BalancerMember http://127.0.0.1:8082 loadfactor=3  
    ProxySet lbmethod=byrequests 
</Proxy>  
ProxyRequests Off 
ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass /balancer-manager !
ProxyPass / balancer://mycluster/ stickysession=JSESSIONID nofailover=Off  
ProxyPassReverse / balancer://mycluster/    

然後通過瀏覽器訪問

“http://localhost:81/balancer-manager”

得到結果

【高可用HA】Apache (3) —— Mac下配置Apache Httpd負載均衡(Load Balancer)之mod_proxy

這樣就完成一個以httpd單節點為負載均衡器分發到不同Tomcat的簡單架構。

* 擴充套件

  • lbmethod具體代表什麼意思?
  • Load Balancer有哪些具體演算法?
  • 為什麼通過Proxy訪問的時候目標頁面沒有樣式和圖片?
  • loadfactor、stickysession有什麼作用
  • ProxyRequests、ProxyPass、ProxyPassReverse又有什麼作用?

相關文章