

首先我們先介紹一下為什么要讓Apache與Tomcat之間進(jìn)行連接。事實(shí)上Tomcat本身已經(jīng)提供了HTTP服務(wù),該服務(wù)默認的端口是8080,裝好tomcat后通過(guò)8080端口可以直接使用Tomcat所運行的應用程序,你也可以將該端口改為80。
既然Tomcat本身已經(jīng)可以提供這樣的服務(wù),我們?yōu)槭裁催€要引入Apache或者其他的一些專(zhuān)門(mén)的HTTP服務(wù)器呢?原因有下面幾個(gè):
1. 提升對靜態(tài)文件的處理性能
2. 利用Web服務(wù)器來(lái)做負載均衡以及容錯
3. 無(wú)縫的升級應用程序
這三點(diǎn)對一個(gè)web網(wǎng)站來(lái)說(shuō)是非常之重要的,我們希望我們的網(wǎng)站不僅是速度快,而且要穩定,不能因為某個(gè)Tomcat宕機或者是升級程序導致用戶(hù)訪(fǎng)問(wèn)不了,而能完成這幾個(gè)功能的、最好的HTTP服務(wù)器也就只有apache的http server了,它跟tomcat的結合是最緊密和可靠的。
接下來(lái)我們介紹三種方法將apache和tomcat整合在一起。
一. JK
這是最常見(jiàn)的方式,你可以在網(wǎng)上找到很多關(guān)于配置JK的網(wǎng)頁(yè),當然最全的還是其官方所提供的文檔。JK本身有兩個(gè)版本分別是1和2,目前1最新的版本是1.2.19,而版本2早已經(jīng)廢棄了,以后不再有新版本的推出了,所以建議你采用版本1。
JK是通過(guò)AJP協(xié)議與Tomcat服務(wù)器進(jìn)行通訊的,Tomcat默認的AJP Connector的端口是8009。JK本身提供了一個(gè)監控以及管理的頁(yè)面jkstatus,通過(guò)jkstatus可以監控JK目前的工作狀態(tài)以及對到tomcat的連接進(jìn)行設置,如下圖所示

在這個(gè)圖中我們可以看到當前JK配了兩個(gè)連接分別到8109和8209端口上,目前s2這個(gè)連接是停止狀態(tài),而s1這個(gè)連接自上次重啟后已經(jīng)處理了47萬(wàn)多個(gè)請求,流量達到6.2個(gè)G,最大的并發(fā)數有13等等。我們也可以利用jkstatus的管理功能來(lái)切換JK到不同的Tomcat上,例如將s2啟用,并停用s1,這個(gè)在更新應用程序的時(shí)候非常有用,而且整個(gè)切換過(guò)程對用戶(hù)來(lái)說(shuō)是透明的,也就達到了無(wú)縫升級的目的。關(guān)于JK的配置文章網(wǎng)上已經(jīng)非常多了,這里我們不再詳細的介紹整個(gè)配置過(guò)程,但我要講一下配置的思路,只要明白了配置的思路,JK就是一個(gè)非常靈活的組件。
JK的配置最關(guān)鍵的有三個(gè)文件,分別是
httpd.conf
Apache服務(wù)器的配置文件,用來(lái)加載JK模塊以及指定JK配置文件信息
workers.properties
到Tomcat服務(wù)器的連接定義文件
uriworkermap.properties
URI映射文件,用來(lái)指定哪些URL由Tomcat處理,你也可以直接在httpd.conf中配置這些URI,但是獨立這些配置的好處是JK模塊會(huì )定期更新該文件的內容,使得我們修改配置的時(shí)候無(wú)需重新啟動(dòng)Apache服務(wù)器。
其中第二、三個(gè)配置文件名都可以自定義。下面是一個(gè)典型的 httpd.conf 對JK的配置
# (httpd.conf)
# 加載mod_jk模塊
LoadModule jk_module modules/mod_jk.so
#
# Configure mod_jk
#
JkWorkersFile conf/workers.properties
JkMountFile conf/uriworkermap.properties
JkLogFile logs/mod_jk.log
JkLogLevel warn
接下來(lái)我們在A(yíng)pache的conf目錄下新建兩個(gè)文件分別是 workers.properties、uriworkermap.properties。這兩個(gè)文件的內容大概如下
#
# workers.properties
#
# list the workers by name
worker.list=DLOG4J, status
# localhost server 1
# ------------------------
worker.s1.port=8109
worker.s1.host=localhost
worker.s1.type=ajp13
# localhost server 2
# ------------------------
worker.s2.port=8209
worker.s2.host=localhost
worker.s2.type=ajp13
worker.s2.stopped=1
worker.DLOG4J.type=lb
worker.retries=3
worker.DLOG4J.balanced_workers=s1, s2
worker.DLOG4J.sticky_session=1
worker.status.type=status
以上的workers.properties配置就是我們前面那個(gè)屏幕抓圖的頁(yè)面所用的配置。首先我們配置了兩個(gè)類(lèi)型為ajp13的worker分別是s1和s2,它們指向同一臺服務(wù)器上運行在兩個(gè)不同端口8109和8209的Tomcat上。接下來(lái)我們配置了一個(gè)類(lèi)型為lb(也就是負載均衡的意思)的worker,它的名字是DLOG4J,這是一個(gè)邏輯的worker,它用來(lái)管理前面配置的兩個(gè)物理連接s1和s2。最后還配置了一個(gè)類(lèi)型為status的worker,這是用來(lái)監控JK本身的模塊。有了這三個(gè)worker還不夠,我們還需要告訴JK,哪些worker是可用的,所以就有worker.list = DLOG4J, status 這行配置。
接下來(lái)便是URI的映射配置了,我們需要指定哪些鏈接是由Tomcat處理的,哪些是由Apache直接處理的,看看下面這個(gè)文件你就能明白其中配置的意義
/*=DLOG4J
/jkstatus=status
!/*.gif=DLOG4J
!/*.jpg=DLOG4J
!/*.png=DLOG4J
!/*.css=DLOG4J
!/*.js=DLOG4J
!/*.htm=DLOG4J
!/*.html=DLOG4J
相信你已經(jīng)明白了一大半了:所有的請求都由DLOG4J這個(gè)worker進(jìn)行處理,但是有幾個(gè)例外,/jkstatus請求由status這個(gè)worker處理。另外這個(gè)配置中每一行數據前面的感嘆號是什么意思呢?感嘆號表示接下來(lái)的URI不要由JK進(jìn)行處理,也就是Apache直接處理所有的圖片、css文件、js文件以及靜態(tài)html文本文件。
通過(guò)對workers.properties和uriworkermap.properties的配置,可以有各種各樣的組合來(lái)滿(mǎn)足我們前面提出對一個(gè)web網(wǎng)站的要求。您不妨動(dòng)手試試!
二. http_proxy
這是利用Apache自帶的mod_proxy模塊使用代理技術(shù)來(lái)連接Tomcat。在配置之前請確保是否使用的是2.2.x版本的Apache服務(wù)器。因為2.2.x版本對這個(gè)模塊進(jìn)行了重寫(xiě),大大的增強了其功能和穩定性。
http_proxy模式是基于HTTP協(xié)議的代理,因此它要求Tomcat必須提供HTTP服務(wù),也就是說(shuō)必須啟用Tomcat的HTTP Connector。一個(gè)最簡(jiǎn)單的配置如下
ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass / http://localhost:8080/
在這個(gè)配置中,我們把所有 http://localhost 的請求代理到 http://localhost:8080/ ,這也就是Tomcat的訪(fǎng)問(wèn)地址,除了images、css、js幾個(gè)目錄除外。我們同樣可以利用mod_proxy來(lái)做負載均衡,再看看下面這個(gè)配置
ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass / balancer://example/
<Proxy balancer://example/>
BalancerMember http://server1:8080/
BalancerMember http://server2:8080/
BalancerMember http://server3:8080/
</Proxy>
配置比JK簡(jiǎn)單多了,而且它也可以通過(guò)一個(gè)頁(yè)面來(lái)監控集群運行的狀態(tài),并做一些簡(jiǎn)單的維護設置。

三. ajp_proxy
ajp_proxy連接方式其實(shí)跟http_proxy方式一樣,都是由mod_proxy所提供的功能。配置也是一樣,只需要把http:// 換成 ajp:// ,同時(shí)連接的是Tomcat的AJP Connector所在的端口。上面例子的配置可以改為
ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass / balancer://example/
<Proxy balancer://example/>
BalancerMember ajp://server1:8080/
BalancerMember ajp://server2:8080/
BalancerMember ajp://server3:8080/
</Proxy>
采用proxy的連接方式,需要在A(yíng)pache上加載所需的模塊,mod_proxy 相關(guān)的模塊有
mod_proxy.so、mod_proxy_connect.so、mod_proxy_http.so、mod_proxy_ftp.so、mod_proxy_ajp.so, 其中mod_proxy_ajp.so只在A(yíng)pache 2.2.x中才有。如果是采用 http_proxy 方式則需要加載 mod_proxy.so 和 mod_proxy_http.so;如果是 ajp_proxy 則需要加載 mod_proxy.so和mod_proxy_ajp.so這兩個(gè)模塊。
四. 三者比較
相對于JK的連接方式,后兩種在配置上是比較簡(jiǎn)單的,靈活性方面也一點(diǎn)都不遜色。但就穩定性而言就不像JK這樣久經(jīng)考驗,畢竟Apache 2.2.3推出的時(shí)間并不長(cháng),采用這種連接方式的網(wǎng)站還不多,因此,如果是應用于關(guān)鍵的互聯(lián)網(wǎng)網(wǎng)站,還是建議采用JK的連接方式。
相關(guān)網(wǎng)址
Apache http://httpd.apache.org
Tomcat http://tomcat.apache.org
JK文檔 http://tomcat.apache.org/connectors-doc/
關(guān)于作者
劉冬,一直使用J2EE/J2ME從事移動(dòng)互聯(lián)網(wǎng)方面的開(kāi)發(fā)。您可以通過(guò)Java自由人網(wǎng)站來(lái)跟他聯(lián)系,網(wǎng)址是:http://www.dlog.cn/javayou ,另外他的郵件地址是javayou@gmail.com。
聯(lián)系客服