本文檔描述了如何在Windows下安裝、配置和運行Apache Jakarta Tomcat服務器。在Linux下要做的工作和下面類似。Apache Jakarta Tomcat的項目主頁是:http://jakarta.apache.org/tomcat
Tomcat Installation
從http://jakarta.apache.org/tomcat下載Apache Jakarta Tomcat 5.0.18的zip壓縮包
解壓縮到某個目錄中,比如D:\app\jakarta-tomcat-5.0.18
設置環境變量%CATALINA_HOME%為:D:\app\jakarta-tomcat-5.0.18
進入命令行模式并用以下命令啟動Tomcat:
%CATALINA_HOME%\bin\startup.bat
如果在控制臺看見信息:Server startup in xxxxx ms,則說明Tomcat已經被啟動,它將在端口8080(默認端口)偵聽客戶請求。
測試:打開瀏覽器并訪問http://localhost:8080/,如果可以看見Tomcat的首頁,那么一切正常。
進入命令行模式并用以下命令關閉Tomcat:
%CATALINA_HOME%\bin\shutdown.bat
Tomcat Directory Layout
Tomcat的目錄結構如下: Directory Explanation
bin 存放啟動和關閉Tomcat的可執行腳本
conf Tomcat的配置文件,如server.xml(Tomcat服務器配置文件)和web.xml(被所有webapps共享的配置文件)
work 存放jsp編譯后產生的class文件
webapps 存放web applications,用戶自己需要部署的應用程序也要放到此目錄
logs 存放日志文件
common 被Tomcat Server本身和所有的web applications共享的庫文件(*.jar),如servlet的API就存放在common/lib/servlet-api.jar中
shared 被所有的web applications(但不被Tomcat Server本身)共享的庫文件(*.jar)
Tomcat Components
Server : Tomcat Server是整個Catalina JSP/Servlet容器,它是一個單件(Sinleton)。
Service : Service是這樣一個集合:它由一個或者多個Connector組成,并擁有一個負責處理所有Connector所獲得的客戶請求的Engine。
Connector : 一個Connector將在某個指定端口上偵聽客戶請求,并將獲得的請求交給Engine來處理,從Engine處獲得回應并返回客戶。Tomcat有兩個典型的Connector,一個直接偵聽來自web瀏覽器的HTTP請求,一個偵聽來自其它WebServer的請求:
Coyote Http/1.1 Connector 在端口8080處偵聽來自客戶browser的http請求。
Coyote JK2 Connector 在端口8009處偵聽來自其它WebServer(Apache)的servlet/jsp代理請求。
Engine : Engine是某個service中的請求處理機,它負責接收和處理來自Connector的請求。Engine下可以配置多個虛擬主機(Virtual Host),每個虛擬主機都有一個域名。當Engine獲得一個請求時,它將根據請求中的信息把該請求匹配到某個Host上,然后在該Host配置的環境下處理該請求。Engine有一個默認虛擬主機,當請求無法匹配到任何一個Host上的時候,將交給該默認虛擬主機來處理。
Host : 一個Host代表一個虛擬主機(Virtual Host),每個虛擬主機和某個域名(Domain Name)相匹配。每個虛擬主機下都可以部署(deploy)一個或者多個web applications,每個web application對應于一個Context,并擁有一個Context path。當Host獲得一個針對某個特定的Host的請求時,將在該Host的環境下把請求匹配到某個Context上,然后把請求交給該Context來處理。Context的匹配方法是“最長匹配”,所以一個 path="" 的Context將成為該Host的默認Context,所有無法和其它Context的路徑名匹配的請求都將最終和該默認Context匹配。
Context : 一個Context對應于一個web application,一個web application由一個或者多個Servlet組成。每個Context在創建的時候都將根據配置文件conf/web.xml和webapps/${webapp.home}/WEB-INF/web.xml載入Servlet類和創建映射表(mapping table)。當Context獲得請求時,將在自己的映射表中尋找相匹配的Servlet類。如果找到,則執行該類,獲得結果并返回。
Tomcat Server的結構圖如下。注意下圖只是根據conf/server.xml配置文件畫出的結構圖,并不保證該圖與Tomcat的實現相吻合。
Server Configuration
用戶可以通過修改conf/server.xml文件定置Tomcat Server的行為。該文件的描述如下: element attribute explanation
Server port 指定一個端口,這個端口負責監聽關閉Tomcat的請求
shutdown 向以上端口發送的關閉服務器的命令字符串
Service name service的名稱
Connector port 服務器連接器的端口號,該連接器將在指定端口偵聽來自客戶端的請求
minProcessors 服務器啟動時創建的處理請求的線程數,每個請求由一個線程負責
maxProcessors 最多可以創建的處理請求的線程數
enableLookups 如果為true,則可以通過調用request.getRemoteHost()進行DNS查詢來得到遠程客戶端的實際主機名;若為false則不進行DNS查詢,而是返回其ip地址
redirectPort 服務器正在處理http請求時收到了一個SSL傳輸請求后重定向的端口號
acceptCount 當所有可以使用的處理請求的線程都被用光時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理,而返回Connection refused錯誤
connectionTimeout 等待超時的時間數(以毫秒為單位)
Engine defaultHost 缺省的處理請求的虛擬主機名,它至少與其中的一個Host元素的name屬性值是一樣的
Host name 虛擬主機名
appBase web applications的基本目錄
unpackWARs 如果為true,則tomcat會自動將WAR文件解壓;否則不解壓,直接從WAR文件中運行應用程序
Context docBase web application的文件存放路徑或者是WAR文件存放路徑
path 表示此web application的URL的前綴,用來匹配一個Context。請求的URL形式為http://localhost:8080/path/*
reloadable 如果為true,則Tomcat將支持熱部署,會自動檢測web application的/WEB-INF/lib 和/WEB-INF/classes目錄的變化,自動裝載新的JSP和Servlet,我們可以在不重起Tomcat的情況下改變web application
注:還有一些元素沒有介紹,如Logger,Realm,Valve等,是因為暫時我還沒有用到這些元素。你可以通過Tomcat的文檔獲取這些元素的信息。
Web Application Configuration
每個web application對應于某個虛擬主機(Host)下的某個Context。一個web application是若干個HTML,JSP和Servlet文件的集合。當一個web application被初始化的時候,它將用自己的ClassLoader載入“部署配置文件” web.xml 中定義的每個Servlet類和映射表。它首先載入在conf/web.xml中定義的Servlet類和映射表,然后載入位于 webapps/${docBase}/WEB-INF/web.xml 下的自己的部署配置文件中定義的servlet類和映射表。
web.xml文件有兩部分:Servlet類定義和映射表定義。每個被載入的Servlet類都有一個名字(不是類名),該名字被填入Context的映射表(mapping table)中,并和某種形式的URL pattern相聯系。當某個URL被請求時,將先尋找對應的Host,然后匹配最長的Context,然后查詢該Context下的mapping table,找到被請求的Servlet類,并執行之。
分析一下web.xml文件的結構: element sub-element explanation
servlet servlet-name Servlet名字(不是類名,只是一個標識符)
servlet-class Servlet的類名(全稱,包括包名,該名用來定位一個Servlet類)
init-param Servlet的初始化參數,每個參數用一個名值對表示:param-name = param-value
servlet-mapping servlet-name Servlet名字,和servlet中的servlet-name相對應
url-pattern URL匹配模式,當請求該模式的URL時,指定Servlet將被調用
分析一下conf/web.xml文件,該文件被所有的web applications共享,其中定義的Servlet類和映射表將被所有的web application載入。 servlet-name url-pattern function
default / 由于對URL進行最長匹配,所以url-pattern為/的該Servlet將在用戶的HTTP請求無法匹配任何一個Servlet的時候被調用。該Servlet將返回用戶一條錯誤信息。
invoker /servlet/* 形式為/servlet/FullClassName的URL會和invoker匹配,invoker將根據FullClassName調用${webapp.home}/WEB-INF/classes/FullClassName類,即使該類沒有在${webapp.home}/WEB-INF/web.xml中被聲明。注意FullClassName必須包含用點分隔的包的全稱。
jsp *.jsp, *.jspx 當請求的是一個JSP頁面的時候(*.jsp),該Servlet被調用。它實質上是一個JSP編譯器,將請求的JSP頁面映射成相應的Servlet在執行。當該JSP頁面還沒有編譯的時候,jsp還將完成編譯工作。
How Tomcat is Dealing with an HTTP Request
假設來自客戶的HTTP請求為:http://localhost:8080/yourContext/yourJSPPage.jsp
請求被發送到本機端口8080,被在那里偵聽的Coyote HTTP/1.1 Connector獲得
Connector把該請求交給它所在的Service的Engine來處理,并等待來自Engine的回應
Engine獲得請求localhost/yourContext/yourJSPPage.jsp,匹配它所擁有的所有虛擬主機Host
Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理,因為該Host被定義為該Engine的默認主機)
localhost Host獲得請求/yourContext/yourJSPPage.jsp,匹配它所擁有的所有Context(最長匹配)
Host匹配到路徑為/yourContext的Context(如果匹配不到就把該請求交給路徑名為""的Context去處理)
path="/yourContext"的Context獲得請求/yourJSPPage.jsp,在它的mapping table中尋找對應的Servlet
Context匹配到URL pattern為*.jsp的Servlet,對應于JspServlet類
構造HttpServletRequest對象和HttpServletResponse對象,作為參數調用JspServlet的doGet或doPost方法(調用什么方法取決于來自客戶的HTTP請求是GET請求還是POST請求)
Context把執行完了之后的HttpServletResponse對象返回給Host
Host把HttpServletResponse對象返回給Engine
Engine把HttpServletResponse對象返回給Connector
Connector把HttpServletResponse對象返回給客戶的web瀏覽器
Tomcat Web Application Manager
通過以下方法可以為自己設置一個manager的權限,用來管理web applications,而不用手工修改配置文件。
修改conf/tomcat-user.xml文件,在相應位置加入以下行:
打開Tomcat首頁:http://localhost:8080/,進入Administration / Tomcat Manager
Tomcat使用的應該是基于角色(role)的安全管理,在這方面我涉獵不深,有待進一步研究。
Tomcat Installation
從http://jakarta.apache.org/tomcat下載Apache Jakarta Tomcat 5.0.18的zip壓縮包
解壓縮到某個目錄中,比如D:\app\jakarta-tomcat-5.0.18
設置環境變量%CATALINA_HOME%為:D:\app\jakarta-tomcat-5.0.18
進入命令行模式并用以下命令啟動Tomcat:
%CATALINA_HOME%\bin\startup.bat
如果在控制臺看見信息:Server startup in xxxxx ms,則說明Tomcat已經被啟動,它將在端口8080(默認端口)偵聽客戶請求。
測試:打開瀏覽器并訪問http://localhost:8080/,如果可以看見Tomcat的首頁,那么一切正常。
進入命令行模式并用以下命令關閉Tomcat:
%CATALINA_HOME%\bin\shutdown.bat
Tomcat Directory Layout
Tomcat的目錄結構如下: Directory Explanation
bin 存放啟動和關閉Tomcat的可執行腳本
conf Tomcat的配置文件,如server.xml(Tomcat服務器配置文件)和web.xml(被所有webapps共享的配置文件)
work 存放jsp編譯后產生的class文件
webapps 存放web applications,用戶自己需要部署的應用程序也要放到此目錄
logs 存放日志文件
common 被Tomcat Server本身和所有的web applications共享的庫文件(*.jar),如servlet的API就存放在common/lib/servlet-api.jar中
shared 被所有的web applications(但不被Tomcat Server本身)共享的庫文件(*.jar)
Tomcat Components
Server : Tomcat Server是整個Catalina JSP/Servlet容器,它是一個單件(Sinleton)。
Service : Service是這樣一個集合:它由一個或者多個Connector組成,并擁有一個負責處理所有Connector所獲得的客戶請求的Engine。
Connector : 一個Connector將在某個指定端口上偵聽客戶請求,并將獲得的請求交給Engine來處理,從Engine處獲得回應并返回客戶。Tomcat有兩個典型的Connector,一個直接偵聽來自web瀏覽器的HTTP請求,一個偵聽來自其它WebServer的請求:
Coyote Http/1.1 Connector 在端口8080處偵聽來自客戶browser的http請求。
Coyote JK2 Connector 在端口8009處偵聽來自其它WebServer(Apache)的servlet/jsp代理請求。
Engine : Engine是某個service中的請求處理機,它負責接收和處理來自Connector的請求。Engine下可以配置多個虛擬主機(Virtual Host),每個虛擬主機都有一個域名。當Engine獲得一個請求時,它將根據請求中的信息把該請求匹配到某個Host上,然后在該Host配置的環境下處理該請求。Engine有一個默認虛擬主機,當請求無法匹配到任何一個Host上的時候,將交給該默認虛擬主機來處理。
Host : 一個Host代表一個虛擬主機(Virtual Host),每個虛擬主機和某個域名(Domain Name)相匹配。每個虛擬主機下都可以部署(deploy)一個或者多個web applications,每個web application對應于一個Context,并擁有一個Context path。當Host獲得一個針對某個特定的Host的請求時,將在該Host的環境下把請求匹配到某個Context上,然后把請求交給該Context來處理。Context的匹配方法是“最長匹配”,所以一個 path="" 的Context將成為該Host的默認Context,所有無法和其它Context的路徑名匹配的請求都將最終和該默認Context匹配。
Context : 一個Context對應于一個web application,一個web application由一個或者多個Servlet組成。每個Context在創建的時候都將根據配置文件conf/web.xml和webapps/${webapp.home}/WEB-INF/web.xml載入Servlet類和創建映射表(mapping table)。當Context獲得請求時,將在自己的映射表中尋找相匹配的Servlet類。如果找到,則執行該類,獲得結果并返回。
Tomcat Server的結構圖如下。注意下圖只是根據conf/server.xml配置文件畫出的結構圖,并不保證該圖與Tomcat的實現相吻合。
Server Configuration
用戶可以通過修改conf/server.xml文件定置Tomcat Server的行為。該文件的描述如下: element attribute explanation
Server port 指定一個端口,這個端口負責監聽關閉Tomcat的請求
shutdown 向以上端口發送的關閉服務器的命令字符串
Service name service的名稱
Connector port 服務器連接器的端口號,該連接器將在指定端口偵聽來自客戶端的請求
minProcessors 服務器啟動時創建的處理請求的線程數,每個請求由一個線程負責
maxProcessors 最多可以創建的處理請求的線程數
enableLookups 如果為true,則可以通過調用request.getRemoteHost()進行DNS查詢來得到遠程客戶端的實際主機名;若為false則不進行DNS查詢,而是返回其ip地址
redirectPort 服務器正在處理http請求時收到了一個SSL傳輸請求后重定向的端口號
acceptCount 當所有可以使用的處理請求的線程都被用光時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理,而返回Connection refused錯誤
connectionTimeout 等待超時的時間數(以毫秒為單位)
Engine defaultHost 缺省的處理請求的虛擬主機名,它至少與其中的一個Host元素的name屬性值是一樣的
Host name 虛擬主機名
appBase web applications的基本目錄
unpackWARs 如果為true,則tomcat會自動將WAR文件解壓;否則不解壓,直接從WAR文件中運行應用程序
Context docBase web application的文件存放路徑或者是WAR文件存放路徑
path 表示此web application的URL的前綴,用來匹配一個Context。請求的URL形式為http://localhost:8080/path/*
reloadable 如果為true,則Tomcat將支持熱部署,會自動檢測web application的/WEB-INF/lib 和/WEB-INF/classes目錄的變化,自動裝載新的JSP和Servlet,我們可以在不重起Tomcat的情況下改變web application
注:還有一些元素沒有介紹,如Logger,Realm,Valve等,是因為暫時我還沒有用到這些元素。你可以通過Tomcat的文檔獲取這些元素的信息。
Web Application Configuration
每個web application對應于某個虛擬主機(Host)下的某個Context。一個web application是若干個HTML,JSP和Servlet文件的集合。當一個web application被初始化的時候,它將用自己的ClassLoader載入“部署配置文件” web.xml 中定義的每個Servlet類和映射表。它首先載入在conf/web.xml中定義的Servlet類和映射表,然后載入位于 webapps/${docBase}/WEB-INF/web.xml 下的自己的部署配置文件中定義的servlet類和映射表。
web.xml文件有兩部分:Servlet類定義和映射表定義。每個被載入的Servlet類都有一個名字(不是類名),該名字被填入Context的映射表(mapping table)中,并和某種形式的URL pattern相聯系。當某個URL被請求時,將先尋找對應的Host,然后匹配最長的Context,然后查詢該Context下的mapping table,找到被請求的Servlet類,并執行之。
分析一下web.xml文件的結構: element sub-element explanation
servlet servlet-name Servlet名字(不是類名,只是一個標識符)
servlet-class Servlet的類名(全稱,包括包名,該名用來定位一個Servlet類)
init-param Servlet的初始化參數,每個參數用一個名值對表示:param-name = param-value
servlet-mapping servlet-name Servlet名字,和servlet中的servlet-name相對應
url-pattern URL匹配模式,當請求該模式的URL時,指定Servlet將被調用
分析一下conf/web.xml文件,該文件被所有的web applications共享,其中定義的Servlet類和映射表將被所有的web application載入。 servlet-name url-pattern function
default / 由于對URL進行最長匹配,所以url-pattern為/的該Servlet將在用戶的HTTP請求無法匹配任何一個Servlet的時候被調用。該Servlet將返回用戶一條錯誤信息。
invoker /servlet/* 形式為/servlet/FullClassName的URL會和invoker匹配,invoker將根據FullClassName調用${webapp.home}/WEB-INF/classes/FullClassName類,即使該類沒有在${webapp.home}/WEB-INF/web.xml中被聲明。注意FullClassName必須包含用點分隔的包的全稱。
jsp *.jsp, *.jspx 當請求的是一個JSP頁面的時候(*.jsp),該Servlet被調用。它實質上是一個JSP編譯器,將請求的JSP頁面映射成相應的Servlet在執行。當該JSP頁面還沒有編譯的時候,jsp還將完成編譯工作。
How Tomcat is Dealing with an HTTP Request
假設來自客戶的HTTP請求為:http://localhost:8080/yourContext/yourJSPPage.jsp
請求被發送到本機端口8080,被在那里偵聽的Coyote HTTP/1.1 Connector獲得
Connector把該請求交給它所在的Service的Engine來處理,并等待來自Engine的回應
Engine獲得請求localhost/yourContext/yourJSPPage.jsp,匹配它所擁有的所有虛擬主機Host
Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理,因為該Host被定義為該Engine的默認主機)
localhost Host獲得請求/yourContext/yourJSPPage.jsp,匹配它所擁有的所有Context(最長匹配)
Host匹配到路徑為/yourContext的Context(如果匹配不到就把該請求交給路徑名為""的Context去處理)
path="/yourContext"的Context獲得請求/yourJSPPage.jsp,在它的mapping table中尋找對應的Servlet
Context匹配到URL pattern為*.jsp的Servlet,對應于JspServlet類
構造HttpServletRequest對象和HttpServletResponse對象,作為參數調用JspServlet的doGet或doPost方法(調用什么方法取決于來自客戶的HTTP請求是GET請求還是POST請求)
Context把執行完了之后的HttpServletResponse對象返回給Host
Host把HttpServletResponse對象返回給Engine
Engine把HttpServletResponse對象返回給Connector
Connector把HttpServletResponse對象返回給客戶的web瀏覽器
Tomcat Web Application Manager
通過以下方法可以為自己設置一個manager的權限,用來管理web applications,而不用手工修改配置文件。
修改conf/tomcat-user.xml文件,在相應位置加入以下行:
打開Tomcat首頁:http://localhost:8080/,進入Administration / Tomcat Manager
Tomcat使用的應該是基于角色(role)的安全管理,在這方面我涉獵不深,有待進一步研究。]]>
posted on 2005-09-20 23:35
Sung 閱讀(1062)
評論(0) 編輯 收藏 所屬分類:
Tomcat