Apache 和 Tomcat 都是Web服務器,它們之間既有聯系又有區別。Apache主要負責靜態解析,如HTML。Tomcat主要負責動態解析,如JSP。
為什么要讓 Apache 與 Tomcat 之間進行連接呢?
原因有下面幾個:
提升對靜態文件的處理性能
利用 Web 服務器來做負載均衡以及容錯
無縫的升級應用程序
Apache 和 Tomcat整合原理:
Apache負責處理HTML靜態內容
Tomcat負責處理動態內容
換而言之:Apache是一輛車,上面可以裝一些東西如html等,但是不能裝水,要裝水必須要有桶(容器),而這個桶也可以不放在卡車上,那這個桶就是Tomcat。
Apache HTTP Server 與 Tomcat 的三種連接方式
JK
編譯生成mod_jk模塊
在apache中加載mod_jk并對其進行配置
在tomcat中修改配置以使其能接受mod_jk的轉發
編譯生成mod_jk.so,然后將其復制到httpd加載模塊默認的目錄/etc/httpd/modules
yum install httpd-devel -y #編譯生成apache擴展依賴apxs,如未安裝先安裝
wgethttp://mirrors.hust.edu.cn/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.42-src.tar.gz
tar-zxftomcat-connectors-1.2.42-src.tar.gz
cdtomcat-connectors-1.2.42-src/native/
./configure--with-apxs=/usr/sbin/apxs
make
cp./apache-2.0/mod_jk.so/etc/httpd/modules/
https://tomcat.apache.org/download-connectors.cgi
JK 是通過 AJP 協議與 Tomcat 服務器進行通訊的,Tomcat 默認的 AJP Connector 的端口是 8009。
JK 本身提供了一個監控以及管理的頁面 jkstatus,通過 jkstatus 可以監控 JK 目前的工作狀態以及對到 tomcat 的連接進行設置,如下圖所示:
圖中JK配了兩個連接分別到 8109 和 8209 端口上,
也可以利用 jkstatus 的管理功能來切換 JK 到不同的 Tomcat 上,例如將 s2 啟用,并停用 s1
JK 的配置最關鍵的有三個文件,分別是
httpd.conf
Apache 服務器的配置文件,用來加載 JK 模塊以及指定 JK 配置文件信息
workers.properties
到 Tomcat 服務器的連接定義文件
Workers實際上屬于Tomcat的鏈接器(Connector),代表了一個Tomcat實例,這個實例代表了由某種web服務器來執行 servelet程序。
舉例來說,我們可以使用某個服務器,例如apache 來把servelet請求轉遞Tomcat進程(worker)來進行后臺處理。
Tomcat workers都定義在一個叫做workers.properties屬性文件之中,并且workers的說明告訴應該如何使用它們。
可以通過屬性文件來為Tomcat Web服務器插件定義Worker。(在conf/下有個文件名為wo rkers.properties就是一個可用Workers屬性文件).
worker.list=<由逗號分離開的worker名稱列表>
worker.list= worker1, worker2
當啟動服務器的時候,Web服務器插件會把這些出現在worker.list屬性中出現名字的worker實例化,而這些也就是你可以用來映射請求的worker
Workers的類型
對于每個有名字的worker都會有若干條目給使用者提供worker自身的附加信息。這些信息包括worker的類型和與之相關的worker的信息。JK 1.2.5中包含下列的worker類型:
類型 說明
ajp12 這種worker知道如何使用ajpv12協議去給用來外部處理的worker傳遞一個請求。
ajp13 這種worker知道如何使用ajpv13協議去給用來外部處理的worker傳遞一個請求。
lb 這是一個負載平衡worker;它知道怎樣在一定容錯范圍內提供一個基于粘性負載的循環。
status 這是一個狀態worker來管理負載平衡。
sticky_session指明帶有會話線程ID的請求是否應該被發送回到同一個Tomcat worker。
uriworkermap.properties
URI 映射文件,用來指定哪些 URL 由 Tomcat 處理,
配置httpd.conf
接下來我們在 Apache 的 conf 目錄下新建兩個文件分別是 workers.properties、uriworkermap.properties。這兩個文件的內容大概如下
首先我們配置了兩個類型為 ajp13 的 worker 分別是 s1 和 s2,它們指向同一臺服務器上運行在兩個不同端口 8109 和 8209 的 Tomcat 上。
接下來我們配置了一個類型為 lb(也就是負載均衡的意思)的 worker,它的名字是 ZYKJ,這是一個邏輯的 worker,它用來管理前面配置的兩個物理連接 s1 和 s2。
最后還配置了一個類型為 status 的 worker,這是用來監控 JK 本身的模塊。
有了這三個 worker 還不夠,我們還需要告訴 JK,哪些 worker 是可用的,所以就有 worker.list = ZYKJ, status 這行配置。
接下來便是 URI 的映射配置了,我們需要指定哪些鏈接是由 Tomcat 處理的,哪些是由 Apache 直接處理的
所有的請求都由 ZYKJ 這個 worker 進行處理,但是有幾個例外,/jkstatus 請求由 status 這個 worker 處理。
感嘆號表示接下來的 URI 不要由 JK 進行處理,也就是 Apache 直接處理所有的圖片、css 文件、js 文件以及靜態 html 文本文件。
通過對 workers.properties 和 uriworkermap.properties 的配置,可以有各種各樣的組合來滿足我們前面提出對一個 web 網站的要求
二、http_proxy
這是利用 Apache 自帶的 mod_proxy 模塊使用代理技術來連接 Tomcat。
http_proxy 模式是基于 HTTP 協議的代理,因此它要求 Tomcat 必須提供 HTTP 服務,也就是說必須啟用 Tomcat 的 HTTP Connector。一個最簡單的配置如下
在這個配置中,我們把所有 http://localhost 的請求代理到 http://localhost:8080/ ,這也就是 Tomcat 的訪問地址,除了 images、css、js 幾個目錄除外。我們同樣可以利用 mod_proxy 來做負載均衡,再看看下面這個配置
三、ajp_proxy
ajpproxy 連接方式其實跟 httpproxy 方式一樣,都是由 mod_proxy 所提供的功能。配置也是一樣,只需要把 http:// 換成 ajp:// ,同時連接的是 Tomcat 的 AJP Connector 所在的端口。上面例子的配置可以改為:
采用 proxy 的連接方式,需要在 Apache 上加載所需的模塊,mod_proxy 相關的模塊有
mod_proxy.so、
modproxyconnect.so、
modproxyhttp.so、
modproxyftp.so、
modproxyajp.so
總結
相對于 JK 的連接方式,后兩種在配置上是比較簡單的,靈活性方面也一點都不遜色。但就穩定性而言就不像 JK 這樣久經考驗,如果是應用于關鍵的互聯網網站,還是建議采用 JK 的連接方式。