Tomcat開發技術之與HTTP服務器的集成

Tomcat開發技術之與HTTP服務器的集成 

Tomcat最主要的功能是提供Servlet/JSP容器,盡管它也可以作為獨立的Java Web服務器,它在對靜態資源(如HTML文件或圖像文件)的處理速度,以及提供的Web服務器管理功能方面都不如其他專業的HTTP服務器,如IIS和Apache服務器。

因此在實際應用中,常常把Tomcat與其他HTTP服務器集成。對於不支持Servlet/JSP的HTTP服務器,可以通過Tomcat服務器來運行Servlet/JSP組件。

當Tomcat與其他HTTP服務器集成時,Tomcat服務器的工作模式通常為進程外的Servlet容ubuntu 輸入法器,Tomcat服務器與其他HTTP服務器之間通過專門的插件來通信。關於Tomcat服務器的工作模式的概念可以參考本書1.4節。

本章首先討論Tomcat與HTTP服務器集成的一般原理,然後介紹Tomcat與Apache以及IIS集成的詳細步驟。

22.1 Tomcat與HTTP服務器集成的原理

Tomcat服務器通過Connector連接器組件與客戶程序建立連接,Connector組件負責接收客戶的請求,以及把Tomcat服務器的響應結果發送給客戶。默認情況下,Tomcat在server.xml中配置了兩種連接器:

<!-- Define a non-SSL Coyote HTTP/1.1
Connector on port 8080 -->
<Connector port="8080"
maxThreads="150"
minSpareThreads="25"
maxSpareThreads="75"
enableLookups="false"
redirectPort="8443"
acceptCount="100"
debug="0"
connectionTimeout="20000"
disableUploadTimeout="true" />

<!-- Define a Coyote/JK2 AJP 1.3
Connector on port 8009 -->
<Connector port="8009"
enableLookups="false"
redirectPort="8443" debug="0"
protocol="AJP/1.3" />


第一個連接器監聽8080端口,負責建立HTTP連接。在通過瀏覽器訪問Tomcat服務器的Web應用時,使用的就是這個連接器。



第二個連接器監聽8009端口,負責和其他的HTTP服務器建立連接。Cisco CCNP培訓在把Tomcat與其他HTTP服務器集成時,就需要用到這個連接器。



Web客戶訪問Tomcat服務器上JSP組件的兩種方式如圖22-1所示。







圖22-1 Web客戶訪問Tomcat服務器上的JSP組件的兩種方式


在圖22-1中,Web客戶 1直接訪問Tomcat服務器上的JSP組件,他訪問的URL為http://localhost:8080/index.jsp。Web客戶2通過 HTTP服務器訪問Tomcat服務器上的JSP組件。假定HTTP服務器使用的HTTP端口為默認的80端口,那麽Web客戶2訪問的URL為 http://localhost:80/index.jsp 或者 http://localhost/index.jsp。



下面,介紹Tomcat與HTTP服務器之間是如何通信的。



22.1.1 JK插件



Tomcat 提供了專門的JK插件來負責Tomcat和HTTP服務器的通信。應該把JK插件安置在對方的HTTP服務器上。當HTTP服務器接收到客戶請求時,它會 通過JK插件來過濾URL,JK插件根據預先配置好的URL映射信息,決定是否要把客戶請求轉發給Tomcat服務器處理。



假定在預 先配置好的URL映射信息中,所有"/*.jsp"形式

Ubuntu 論壇

的URL都由Tomcat服務器來處理,那麽在圖22-1的例子中,JK插件將把客戶請求轉發給 Tomcat服務器,Tomcat服務器於是運行index.jsp,然後把響應結果傳給HTTP服務器,HTTP服務器再把響應結果傳給Web客戶2。



對於不同的HTTP服務器,Tomcat提供了不同的JK插件的實現模塊。本章將用到以下JK插件:



與Windows下的Apache HTTP服務器集成:mod_jk_2.0.46.dll



與Linux(RedHet)下的Apache HTTP服務器集成:mod_jk.so-ap2.0.46-rh72..46-rh72



與IIS服務器集成:isapi_redirect.dll



22.1.2 AJP協議



AJP是為Tomcat與HTTP服務器之間通信而定制的協議,能提供較高的通信速度和效率。在配置Tomcat與HTTP服務器集成中,讀者可以不必關心AJP協議的細節。關於

AJP的知識也可以參考網址:



http://jakarta.apache.org/builds/jakarta-tomcat-connectors/jk2/doc/common/AJPv13.html



22.2 在Windows下Tomcat與Apache服務器集成



Apache HTTP服務器是Apache軟件組織提供的開放源代碼軟件,它是一個非常優秀的專業的Web服務器,為網絡管理員提供了豐富多彩的Web管理功能,包括 目錄索引、目錄別名、內容協商、可配置的HTTP錯誤報告、CGI程序的SetUID執行、子進程資源管理、服務器端圖像映射、重寫URL、URL拼寫檢 查以及聯機手冊等。



Apache HTTP服務器本身沒有提供Servlet/JSP容器。因此,在實際應用中,把Tomcat與Apache集成,可以建立具有實用價值的商業化的Web 平臺。在Windows NT/2000下Tomcat與Apache服務器集成需要準備的軟件參見表22-1。BT無線網絡破解教程



表22-1 在Windows NT/2000下Tomcat與Apache服務器集成需要準備的軟件



軟 件下 載 位 置本書配套光盤上的位置
基於Windows NT/2000的 Apache HTTP服務器軟件http://httpd.apache.org /download.cgisoftware/apache_2.0.47- win32-x86-no_ssl.msi
JK插件http://jakarta.apache.org/builds /jakarta-tomcat-connectors/jklib/ mod_jk_2.0.46.dll


1、安裝Apache HTTP服務器



運行apache_2.0.47-win32-x86-no_ssl.msi,就啟動了Apache HTTP服務器的安裝程序,只要按默認設置進行安裝即可。如果安裝成功,會自動在Windows中加入Apache HTTP服務,如圖22-2所示。






圖22-2 加入到Windows服務中的Apache服務


假定Apache的根目錄為,在其conf子目錄下有一個配置文件httpd.conf。如果Apache安裝在本機,並且采用默認的80端口作為HTTP端口,在httpd.conf文件中會看到如下屬性:



Listen 80
ServerName localhost:80


在操作系統的【開始】→【程序】→【Apache HTTP Server 2.0思科培訓團購.47】→【Control Apache Server】菜單中,提供了重啟(Restart)、啟動(Start)和關閉(Stop)Apache服務器的子菜單。



應該確保80端口沒有被占用,否則Apache服務器無法啟動。Apache服務器啟動後,就可以通過訪問Apache的測試頁來確定是否安裝成功。訪問http://localhost,如果出現如圖22-3所示的網頁,就說明Apache已經安裝成功了。






圖22-3 Apache服務器的測試網頁


2、在Apache中加入JK插件



在Apache中加入JK插件,只要把mod_jk_2.0.46.dll拷貝到/modules目錄下即可。



3、創建workers.properties文件



workers.properties文件用於配置Tomcat的信息,它的存放位置為 /conf/workers.properties。在本書配套光盤的sourcecode/chapter22/windows_apache目錄下提 供了workers.properties文件,它的內思科路由器容如下("#"後面為註釋信息):



workers.tomcat_home=C:\jakarta-tomcat 
#讓mod_jk模塊知道Tomcat
workers.java_home=C:\j2sdk1.4.2
#讓mod_jk模塊知道j2sdk
ps=\
#指定文件路徑分割符
worker.list=worker1
worker.worker1.port=8009
#工作端口,若沒占用則不用修改
worker.worker1.host=localhost
#Tomcat服務器的地址
worker.worker1.type=ajp13
#類型
worker.worker1.lbfactor=1
#負載平衡因數


以上文件中的屬性描述參見表22-2。



表22-2 workers.properties文件的屬性



屬 性描 述
workers.tomcat_home指定Tomcat服務器的根目錄
workers.java_home指定JDK的根目錄
worker.list指定Tomcat服務器工作名單
worker.worker1.port指定Tomcat服務器使用的JK 端口
worker.worker1.host指定Tomcat服務器的IP地址
worker.worker1.type指定Tomcat服務器 與Apache之間的通信協議
worker.worker1.lbfactor指定負載平衡因數(Load Balance Factor)。 只有在使用了負載平衡器 (LoadBalancer)的情況下, 這個屬性才有意義


4、修改Apache的配置文件httpd.conf



打開/conf/httpd.conf文件,在其末尾加入以下內容:



# Using mod_jk2.dll to 
redirect dynamic calls to Tomcat
LoadModule jk_module
modules\mod_jk_2.0.46.dll
JkWorkersFile
"conf\workers.properties"
JkLogFile "logs\mod_jk2.log"
JkLogLevel debug
JkMount /*.jsp worker1
JkMount /helloapp/* worker1


在本書配套光盤的sourcecode/chapter22/windows_apache/httpd_modify.conf文件中提供了以上內容,它指示Apache服務器加載JK插件,並且為JK插件設置相關屬性,這些屬性的描述參見表22-3。



表22-3 JK插件的相關屬性



屬 性描 述
LoadModule指定加載的JK插件
JkWorkersFile指定JK插件的工作文件
JkLogFile指定JK插件使用的日誌文件, 在實際配置中,可以通過查看這個日誌文件, 來跟蹤JK插件的運行過程, 這對排錯很有用
JkLogLevel指定JK插件的日誌級別, 可選值包括debug、info和error等
JkMount指定JK插件處理的URL映射信息


JkMount用來 指定URL映射信息,"JkMount /*.jsp worker1"表示"/*.jsp"形式的URL都由worker1代表的Tomcat服務器來處理;"JkMount /helloapp/* worker1"表示訪問helloapp應用的URL都由worker1來處理。



5、測試配置



重啟Tomcat 服務器和Apache服務器,通過瀏覽器訪問http://localhost/index.jsp,如果出現Tomcat的默認主頁,說明配置已經成 功。此外,如果在Tomcat服務器上已經發布了helloapp應用,可以訪問http: //localhost/helloapp/index.htm,如果正常返回helloapp應用的index.htm網頁,說明配置已經成功。



如果配置有誤,可以查看JK插件生成的日誌信息,它有助於查找錯誤原因。在Apache的配置文件httpd.conf中設定該日誌文件的存放位置為/logs/mod_jk2.log



6、Apache與多個Tomcat服務器集成時的負載平衡



在實際應用中,如果網站的訪問量非常大,為了提高訪問速度,可以將多個Tomcat服務器與Apache集成,讓它們共同分擔運行Servlet/

JSP組件的任務。 JK插件的loadbalancer(負載平衡器)負責根據在workers.properties文件中預先配置的lbfactor(負載平衡因數)為這些Tomcat服務器分配工作負荷,實現負載平衡。



假 定Apache和兩個Tomcat服務器集成,一個Tomcat服務器和Apache運行在同一臺機器上,使用的JK端口為8009,還有一個 Tomcat服務器運行在另一臺機器上,主機名為anotherhost,使用的JK端口為8009。以下是把Apache和這兩個Tomcat服務器集 成的步驟。



(1)把mod_jk_2.0.46.dll拷貝到/lib目錄下。



(2)在/conf目錄下創建如下的workers.properties文件(註意粗體部分的內容):



ps=\ 
#指定文件路徑分割符
worker.list=worker1,
worker2,loadbalancer

worker.worker1.port=8009
#工作端口,若沒占用則不用修改
worker.worker1.host=localhost
#Tomcat服務器的地址
worker.worker1.type=ajp13
#類型
worker.worker1.lbfactor=100
#負載平衡因數

worker.worker2.port=8009
#工作端口,若沒占用則不用修改
worker.worker2.host=anotherhost
#Tomcat服務器的地址
worker.worker2.type=ajp13
#類型
worker.worker2.lbfactor=100
#負載平衡因數

worker.loadbalancer.type=lb
worker.loadbalancer.
balanced_workers=worker1, worker2


以上文件創建了兩個worker:worker1和worker2分別代表兩個Tomcat服務器,它們由worker.loadbalancer來分配工作負荷。



(3)修改/conf/httpd.conf文件,在文件末尾加入如下內容:



# Using mod_jk2.dll to 
redirect dynamic calls to Tomcat
LoadModule jk_module
modules\mod_jk_2.0.46.dll
JkWorkersFile "conf\workers.properties"
JkLogFile "logs\mod_jk2.log"
JkLogLevel debug
JkMount /*.jsp loadbalancer
JkMount /helloapp/* loadbalancer


當客戶請求"/*.jsp"或"/helloapp/*"形式的URL,該請求都由loadbalancer來負責轉發,它根據在workers.properties文件中為worker1和worker2分配的lbfactor屬性,來決定如何調度它們。



只有在使用了loadbalancer的情況下,workers.properties文件中worker的lbfactor屬性才有意義,lbfactor取值越大,表示分配給Tomcat服務器的工作負荷越大。



(4)修改兩個Tomcat服務器的JK端口,確保它們和workers.properties文件中的配置對應。此外,在使用了loadbalancer後,要求worker的名字和Tomcat的server.xml文件中的元素的jvmRoute屬性一致。



所以應該分別修改兩個Tomcat的sever.xml文件,把它們的元素的jvmRoute屬性分別設為worker1和worker2。以下是修改後的兩個Tomcat服務器的元素:



Tomcat服務器1:



<Engine name="Catalina"
defaultHost="localhost"
debug="0" jmvRoute="worker1">


Tomcat服務器2:



<Engine name="Catalina"
defaultHost="localhost"
debug="0" jmvRoute="worker2">


(5) 在完成以上步驟後,分別啟動兩個Tomcat服務器和Apache服務器,然後訪問http://localhost/index.jsp,會出現 Tomcat服務器的默認主頁。由於此時由loadbalancer來調度Tomcat服務器,因此不能斷定到底訪問的是哪個Tomcat服務器的 index.jsp,這對於Web客戶來說是透明的。



如果在進行以上實驗時,兩個Tomcat服務器都在同一臺機器上運行,應該確保它們沒有使用相同的端口。在Tomcat的默認的server.xml中,一共配置了以下3個端口:



<Server port="8005" 
shutdown="SHUTDOWN" debug="0">
<!-- Define a non-SSL Coyote
HTTP/1.1 Connector on port 8080 -->
<Connector port="8080" />
<!-- Define a Coyote/JK2
AJP 1.3 Connector on port 8009 -->

<Connector port="8009" />


如果兩個Tomcat服務器都在同一臺機器上運行,則至少應該對其中一個Tomcat服務器的以上3個端口號都進行修改。



此 外,如果把Tomcat和其他HTTP服務器集成,Tomcat主要負責處理HTTP服務器轉發過來的客戶請求,通常不會直接接受HTTP請求。因此為了 提高Tomcat的運行性能,可以關閉Tomcat的HTTP連接器,方法為在server.xml中把Tomcat的HTTP Connector的配置註釋掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值