Sung in Blog

                     一些技術文章 & 一些生活雜碎
          本文檔描述了如何在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
          主站蜘蛛池模板: 丹凤县| 漳浦县| 克拉玛依市| 前郭尔| 芒康县| 蒙山县| 无极县| 乌审旗| 临邑县| 平邑县| 孙吴县| 娄烦县| 吕梁市| 瓮安县| 钟山县| 古田县| 永泰县| 博野县| 马公市| 乐山市| 五河县| 永年县| 东明县| 房产| 雷州市| 永宁县| 清流县| 加查县| 环江| 长治市| 顺昌县| 江陵县| 黑水县| 柞水县| 江孜县| 新营市| 天峻县| 定州市| 西城区| 图片| 陆丰市|