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模組即可。