Apache HTTP Server 與 Tomcat 的三種鏈接方式介紹

首先咱們先介紹一下爲何要讓 Apache 與 Tomcat 之間進行鏈接。事實上 Tomcat 自己已經提供了 HTTP 服務,該服務默認的端口是 8080,裝好 tomcat 後經過 8080 端口能夠直接使用 Tomcat 所運行的應用程序,你也能夠將該端口改成 80。css

既然 Tomcat 自己已經能夠提供這樣的服務,咱們爲何還要引入 Apache 或者其餘的一些專門的 HTTP 服務器呢?緣由有下面幾個:html

1. 提高對靜態文件的處理性能web

2. 利用 Web 服務器來作負載均衡以及容錯apache

3. 無縫的升級應用程序tomcat

這三點對一個 web 網站來講是很是之重要的,咱們但願咱們的網站不只是速度快,並且要穩定,不能由於某個 Tomcat 宕機或者是升級程序致使用戶訪問不了,而能完成這幾個功能的、最好的 HTTP 服務器也就只有 apache 的 http server 了,它跟 tomcat 的結合是最緊密和可靠的。服務器

接下來咱們介紹三種方法將 apache 和 tomcat 整合在一塊兒。session

JK併發

這是最多見的方式,你能夠在網上找到不少關於配置JK的網頁,固然最全的仍是其官方所提供的文檔。JK 自己有兩個版本分別是 1 和 2,目前 1 最新的版本是 1.2.19,而版本 2 早已經廢棄了,之後再也不有新版本的推出了,因此建議你採用版本 1。負載均衡

JK 是經過 AJP 協議與 Tomcat 服務器進行通信的,Tomcat 默認的 AJP Connector 的端口是 8009。JK 自己提供了一個監控以及管理的頁面 jkstatus,經過 jkstatus 能夠監控 JK 目前的工做狀態以及對到 tomcat 的鏈接進行設置,以下圖所示:性能


圖 1:監控以及管理的頁面 jkstatus
圖 1:監控以及管理的頁面 jkstatus 

在這個圖中咱們能夠看到當前JK配了兩個鏈接分別到 8109 和 8209 端口上,目前 s2 這個鏈接是中止狀態,而 s1 這個鏈接自上次重啓後已經處理了 47 萬多個請求,流量達到 6.2 個 G,最大的併發數有 13 等等。咱們也能夠利用 jkstatus 的管理功能來切換 JK 到不一樣的 Tomcat 上,例如將 s2 啓用,並停用 s1,這個在更新應用程序的時候很是有用,並且整個切換過程對用戶來講是透明的,也就達到了無縫升級的目的。關於 JK 的配置文章網上已經很是多了,這裏咱們再也不詳細的介紹整個配置過程,但我要講一下配置的思路,只要明白了配置的思路,JK 就是一個很是靈活的組件。

JK 的配置最關鍵的有三個文件,分別是

httpd.conf 
Apache 服務器的配置文件,用來加載 JK 模塊以及指定 JK 配置文件信息

workers.properties 
到 Tomcat 服務器的鏈接定義文件

uriworkermap.properties 
URI 映射文件,用來指定哪些 URL 由 Tomcat 處理,你也能夠直接在 httpd.conf 中配置這些 URI,可是獨立這些配置的好處是 JK 模塊會按期更新該文件的內容,使得咱們修改配置的時候無需從新啓動 Apache 服務器。

其中第2、三個配置文件名均可以自定義。下面是一個典型的 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

 

接下來咱們在 Apache 的 conf 目錄下新建兩個文件分別是 workers.properties、uriworkermap.properties。這兩個文件的內容大概以下

 

#
# 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 配置就是咱們前面那個屏幕抓圖的頁面所用的配置。首先咱們配置了兩個類型爲 ajp13 的 worker 分別是 s1 和 s2,它們指向同一臺服務器上運行在兩個不一樣端口 8109 和 8209 的 Tomcat 上。接下來咱們配置了一個類型爲 lb(也就是負載均衡的意思)的 worker,它的名字是 DLOG4J,這是一個邏輯的 worker,它用來管理前面配置的兩個物理鏈接 s1 和 s2。最後還配置了一個類型爲 status 的 worker,這是用來監控 JK 自己的模塊。有了這三個 worker 還不夠,咱們還須要告訴 JK,哪些 worker 是可用的,因此就有 worker.list = DLOG4J, status 這行配置。

接下來即是 URI 的映射配置了,咱們須要指定哪些連接是由 Tomcat 處理的,哪些是由 Apache 直接處理的,看看下面這個文件你就能明白其中配置的意義

 

/*=DLOG4J
/jkstatus=status
 
!/*.gif=DLOG4J
!/*.jpg=DLOG4J
!/*.png=DLOG4J
!/*.css=DLOG4J
!/*.js=DLOG4J
!/*.htm=DLOG4J
!/*.html=DLOG4J

 

相信你已經明白了一大半了:全部的請求都由 DLOG4J 這個 worker 進行處理,可是有幾個例外,/jkstatus 請求由 status 這個 worker 處理。另外這個配置中每一行數據前面的感嘆號是什麼意思呢?感嘆號表示接下來的 URI 不要由 JK 進行處理,也就是 Apache 直接處理全部的圖片、css 文件、js 文件以及靜態 html 文本文件。

經過對 workers.properties 和 uriworkermap.properties 的配置,能夠有各類各樣的組合來知足咱們前面提出對一個 web 網站的要求。您不妨動手試試!

 

http_proxy

這是利用 Apache 自帶的 mod_proxy 模塊使用代理技術來鏈接 Tomcat。在配置以前請確保是否使用的是 2.2.x 版本的 Apache 服務器。由於 2.2.x 版本對這個模塊進行了重寫,大大的加強了其功能和穩定性。

http_proxy 模式是基於 HTTP 協議的代理,所以它要求 Tomcat 必須提供 HTTP 服務,也就是說必須啓用 Tomcat 的 HTTP Connector。一個最簡單的配置以下

 

ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass / http://localhost:8080/

 

在這個配置中,咱們把全部 http://localhost 的請求代理到 http://localhost:8080/ ,這也就是 Tomcat 的訪問地址,除了 images、css、js 幾個目錄除外。咱們一樣能夠利用 mod_proxy 來作負載均衡,再看看下面這個配置

 

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 簡單多了,並且它也能夠經過一個頁面來監控集羣運行的狀態,並作一些簡單的維護設置。


圖 2:監控集羣運行狀態
圖 2:監控集羣運行狀態 

 

ajp_proxy

ajp_proxy 鏈接方式其實跟 http_proxy 方式同樣,都是由 mod_proxy 所提供的功能。配置也是同樣,只須要把 http:// 換成 ajp:// ,同時鏈接的是 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 的鏈接方式,須要在 Apache 上加載所需的模塊,mod_proxy 相關的模塊有 mod_proxy.so、mod_proxy_connect.so、mod_proxy_http.so、mod_proxy_ftp.so、mod_proxy_ajp.so, 其中 mod_proxy_ajp.so 只在 Apache 2.2.x 中才有。若是是採用 http_proxy 方式則須要加載 mod_proxy.so 和 mod_proxy_http.so;若是是 ajp_proxy 則須要加載 mod_proxy.so 和 mod_proxy_ajp.so這兩個模塊。

 

三者比較

相對於 JK 的鏈接方式,後兩種在配置上是比較簡單的,靈活性方面也一點都不遜色。但就穩定性而言就不像 JK 這樣久經考驗,畢竟 Apache 2.2.3 推出的時間並不長,採用這種鏈接方式的網站還很少,所以,若是是應用於關鍵的互聯網網站,仍是建議採用 JK 的鏈接方式。

相關文章
相關標籤/搜索