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配置反向代理、負載均衡和叢集(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的方式主要可以分為兩類
- httpd自帶的mod_proxy
- Tomcat提供了專門的JK外掛來負責Tomcat和HTTP伺服器的通訊mod_jk
*注意 本篇文章主要關注第一類配置
mod_proxy的兩種實現
- http方式
- 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
重新整理瀏覽器我們會發現下面兩句話會交替出現
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
用瀏覽器訪問出現錯誤
檢視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”
得到結果
這樣就完成一個以httpd單節點為負載均衡器分發到不同Tomcat的簡單架構。
* 擴充套件
- lbmethod具體代表什麼意思?
- Load Balancer有哪些具體演算法?
- 為什麼通過Proxy訪問的時候目標頁面沒有樣式和圖片?
- loadfactor、stickysession有什麼作用
- ProxyRequests、ProxyPass、ProxyPassReverse又有什麼作用?