1. 程式人生 > >Apache與Tomcat整合實現動靜分離與負載均衡的配置實踐

Apache與Tomcat整合實現動靜分離與負載均衡的配置實踐

通常,將Apache與Tomcat整合主要出於以下幾個原因
1. 提升對靜態檔案的處理效能,所有靜態檔案均由前端的Apache響應,其它與JSP相關的請求分發給後端的Tocmat處理;
2. 利用Apache伺服器來做負載均衡以及容錯,前端的Apache可作為一個負載均衡器,將請求分發給後端的多臺Tomcat,當某一臺Tomcat宕機時,可以將其暫時移出叢集;
3. 無縫的升級應用程式,在對後端的多臺Tomcat進行升級部署時,將其暫時移出叢集來實現平滑升級。

而關於Apache與Tomcat整合,有3種方式可以實現:
1. mod_jk
mod_jk 是通過 AJP 協議與 Tomcat 伺服器進行通訊的,Tomcat 預設的 AJP Connector 的埠是 8009。JK 本身提供了一個監控以及管理的頁面jkstatus,通過 jkstatus 可以監控 JK 目前的工作狀態以及對到 tomcat 的連線進行設定;

2. http_proxy
這是利用 Apache 自帶的 mod_proxy 模組使用代理技術來連線Tomcat。在配置之前請確保是否使用的是 2.2.x 版本的 Apache 伺服器。因為 2.2.x版本對這個模組進行了重寫,大大的增強了其功能和穩定性。

3. ajp_proxy
ajp_proxy 連線方式其實跟 http_proxy 方式一樣,也是由 mod_proxy 所提供的功能,但是通過 AJP 協議與 Tomcat 伺服器進行通訊的,這一點又與mod_jk相同。

下面是具體的配置過程:
測試環境介紹:
Cluster:192.168.203.134
Tomcat Server:192.168.203.133
Tomcat Server:192.168.203.135
注:以下所有配置過程均在Cluster上完成。

1. 安裝配置Apache
# wget http://apache.etoak.com//httpd/httpd-2.2.18.tar.bz2

# tar xjvf httpd-2.2.18.tar.bz2

# cd httpd-2.2.18
# ./configure --prefix=/opt/apache2 --enable-so --enable-dav --enable-dav-fs --enable-maintainer-mode --with-included-apr --enable-rewrite --enable-ssl --enable-proxy --enable-proxy-http

# make
# make install

建立apache使用者
# useradd -M apache

修改apache配置檔案,讓它以使用者apache身份執行
# vi /opt/apache2/conf/httpd.conf
============================
User apache
Group apache
============================

2. 通過 Apache mod_jk 方式實現與Tomcat整合
# wget http://labs.mop.com/apache-mirror//tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.35-src.tar.gz
# tar xzvf tomcat-connectors-1.2.35-src.tar.gz
# cd tomcat-connectors-1.2.35-src/native
# ./configure --with-apxs=/opt/apache2/bin/apxs
# make
注:不需要執行make install的過程,僅需在編譯後複製mod_jk.so檔案

# cp ./apache-2.0/mod_jk.so /opt/apache2/modules/

# cd /opt/apache2/conf/

建立 mod_jk 主配置檔案
# vim extra/httpd-jk.conf

01 # Load the jk module
02 LoadModule jk_module modules/mod_jk.so
03
04 # The location of workers.properties
05 JkWorkersFile conf/extra/httpd-jk-workers.properties
06
07 # The location of jk logs
08 JkLogFile logs/httpd-jk.log
09
10 # The location of jk mount file
11 JkMountFile conf/extra/httpd-jk-uriworkermap.properties
12
13 # The jk log level [debug/error/info]
14 JkLogLevel info
15
16 # The log format
17 JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
18
19 # JkOptions indicate to send SSL KEY SIZE,
20 JkOptions  +ForwardKeySize +ForwardURICompat -ForwardDirectories
21
22 # JkRequestLogFormat set the request format
23 JkRequestLogFormat "%w %V %T"

建立 mod_jk 叢集引數配置檔案
# vim extra/httpd-jk-workers.properties

01 # list the workers by name
02
03 worker.list=DLOG4J, status #建立名為DLOG4J與status的worker
04
05 # localhost server 1
06 # ------------------------
07 worker.s1.port=8009 #後端Tomcat伺服器的預設AJP埠
08 worker.s1.host=192.168.203.133 #後端Tomcat伺服器的IP
09 worker.s1.type=ajp13 #採用AJP協議進行通訊
10
11 # localhost server 2
12 # ------------------------
13 worker.s2.port=8009 #後端Tomcat伺服器的預設AJP埠
14 worker.s2.host=192.168.203.135 #後端Tomcat伺服器的IP
15 worker.s2.type=ajp13 #採用AJP協議進行通訊
16 #worker.s2.stopped=1 #是否暫停該伺服器的開關
17
18 worker.DLOG4J.type=lb #採用負載均衡的方式
19 worker.retries=3
20 worker.DLOG4J.balanced_workers=s1, s2 #負載均衡中包括server 1與server 2兩臺Tomcat伺服器
21 worker.DLOG4J.sticky_session=1
22
23 worker.status.type=status #在worker status中對叢集狀態進行監控

建立 mod_jk URL引數檔案
vim extra/httpd-jk-uriworkermap.properties

01 /*=DLOG4J #所有的請求都交給DLOG4J處理
02 /jkstatus=status #在/jkstatus頁面中監控叢集狀態
03
04 !/*.gif=DLOG4J #過濾gif
05 !/*.jpg=DLOG4J #過濾jpg
06 !/*.png=DLOG4J #過濾png
07 !/*.css=DLOG4J #過濾css
08 !/*.js=DLOG4J #過濾js
09 !/*.htm=DLOG4J #過濾htm
10 !/*.html=DLOG4J #過濾html

修改Apache主配置檔案,使其關聯mod_jk主配置檔案
# vim httpd.conf

1 # The JK connector settings
2 Include conf/extra/httpd-jk.conf

啟動Apache
# /opt/apache2/bin/apachectl start

通過統計監聽頁面,可以看到後端伺服器的狀態,如下圖所示:

http://192.168.203.134/jkstatus

通過瀏覽器訪問http://192.168.203.134/index.jsp,可以發現,在多次重新整理之後,請求會隨機分配到後端的Tomcat伺服器上。
而訪問http://192.168.203.134/index.html,請求會直接分配到前端的Apache上。

2. 通過 Apache mod_proxy 方式實現與Tomcat整合
進入Apache原始碼包,新增所需的模組
# cd httpd-2.2.18/modules
# /opt/apache2/bin/apxs -c -i -a proxy/mod_proxy.c proxy/proxy_util.c
# /opt/apache2/bin/apxs -c -i -a proxy/mod_proxy_http.c
# /opt/apache2/bin/apxs -c -i -a proxy/mod_proxy_connect.c
# /opt/apache2/bin/apxs -c -i -a proxy/mod_proxy_ajp.c
# /opt/apache2/bin/apxs -c -i -a proxy/mod_proxy_balancer.c
# /opt/apache2/bin/apxs -c -i -a generators/mod_status.c

新增完成後,在httpd.conf中可以看到以下配置:
---
# Example:
# LoadModule foo_module modules/mod_foo.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule status_module modules/mod_status.so
---

# cd /opt/apache2/conf/

建立 mod_proxy 主配置檔案
vim extra/httpd-proxy.conf

01 ProxyPassMatch /*.gif$ ! #過濾gif
02 ProxyPassMatch /*.jpg$ ! #過濾jpg
03 ProxyPassMatch /*.png$ ! #過濾png
04 ProxyPassMatch /*.css$ ! #過濾css
05 ProxyPassMatch /*.js$ ! #過濾js
06 ProxyPassMatch /*.htm$ ! #過濾htm
07 ProxyPassMatch /*.html$ ! #過濾html
08 ProxyPass /server-status ! #過濾server-stauts監控頁面
09 ProxyPass /balancer-manager ! #過濾balancer-manager監控頁面
10
15 </Proxy>
16
17 <Location /server-status> #設定server-stauts監控頁面
18 SetHandler server-status
19 Order Deny,Allow
20 Deny from all
21 Allow from all
22 </Location>
23
24 <Location /balancer-manager> #設定balancer-manager監控頁面
25 SetHandler balancer-manager
26 Order Deny,Allow
27 Deny from all
28 Allow from all
29 </Location>

修改Apache主配置檔案,使其關聯mod_proxy主配置檔案
vim httpd.conf

1 # The Proxy settings
2 Include conf/extra/httpd-proxy.conf

啟動Apache
# /opt/apache2/bin/apachectl start

通過監控頁面,可以看到後端伺服器的狀態,如下圖所示:

http://192.168.203.134/server-stauts

http://192.168.203.134/balancer-manager

通過瀏覽器訪問http://192.168.203.134/index.jsp,可以發現,在多次重新整理之後,請求會隨機分配到後端的Tomcat伺服器上。
而訪問http://192.168.203.134/index.html,請求會直接分配到前端的Apache上。

3. 通過 Apache mod_proxy_ajp 方式實現與Tomcat整合
整個配置過程與mod_proxy完全相同,僅需要在配置檔案 conf/extra/httpd-proxy.conf 中將http協議修改為ajp協議即可,如下所示:

4. 其它
如果出現 "is built-in and can't be loaded" 類似的錯誤提示,則代表模組以及整合到了Apache當中,此時需要註釋掉相關的LoadModule配置;
鑑於Nginx的高效,通過設定rewrite規則實現與Tomcat整合,處理能力其實比Apache更好;
如果僅僅是為了提升Tomcat的靜態檔案處理能力,則僅需要考慮整合apr模組即可。