1. 程式人生 > >Tomcat簡介(組成,工作原理,執行緒數設定等)

Tomcat簡介(組成,工作原理,執行緒數設定等)

一、簡介:
tomcat是一個免費的開放原始碼的web應用伺服器。屬於輕量級應用伺服器,在中小型系統和併發訪問使用者不是很多的場合下被普遍使用,是開發和除錯JSP程式的首選。當在一臺機器上配置好Apache伺服器,可以利用它響應HTML頁面的訪問請求。實際上Tomcat是Apachae伺服器的擴充套件,但執行時,Tomcat是獨立的。配置正確,Apache為HTML頁面服務,而Tomcat實際上執行JSP頁面和Servlet。Tomact也有處理HTML頁功能,他還是一個Servlet和JSP容器。
注:
servlet:Java servlet的簡稱,稱為小服務程式或者服務聯結器。servlet可以響應任何型別的請求,但大多數情況只用來擴充套件基於HTTP協議的web伺服器。
servlet特點:
1)提供了可被伺服器載入並執行的程式程式碼,並服務於來自客戶端的請求。
2)servlet伺服器必須支援java
3)servlet不依賴瀏覽器,是允許在伺服器端,所以不管瀏覽器是否支援java,都允許請求訪問servlet。Servlet的規範規定servlet不僅能執行在基於pttp協議的web伺服器上,還可以執行在基於其他應用協議的伺服器上。目前主要執行在web伺服器上,用來擴充套件web伺服器的功能。
servlet容器響應客戶請求訪問特定servlet的流程如下:

1)客戶發出要求訪問特定的servlet的請求
2)servlet容器接受到客戶請求並解析
3)servlet容器傳概念一個servletRequest物件,在servletRequest物件中包含了客戶請求資訊及其他關於客戶的資訊。例如請求頭,正文,可幾乎ip地址等
4)servlet容器建立一個servletResponse物件
5)servlet容器呼叫客戶所有請求的servlet的service服務方法,並且把servletRequest物件作為引數傳給該服務方法
6)servlet從servletRequest物件中可獲取客戶的請求資訊
7)servlet利用servletResponse物件來生成響應的結果
8)servlet容器把servlet生成的響應結果傳送給客戶JSP
(java server pages)java伺服器頁面,是在傳統的網頁HTML檔案中插入java程式段和JSP標記,從而
形成JSP檔案。用JSP開發的web用用是跨平臺的。既能在Linux下執行,也能在其他作業系統上執行。二、Tomcat目錄
|---bin Tomcat:存放啟動和關閉tomcat指令碼;
|---confTomcat:存放不同的配置檔案(server.xml和web.xml);
|---doc:存放Tomcat文件;
|---lib/japser/common:存放Tomcat執行需要的庫檔案(JARS);
|---logs:存放Tomcat執行時的LOG檔案;
|---src:存放Tomcat的原始碼;
|---webapps:Tomcat的主要Web釋出目錄(包括應用程式示例);
|---work:存放jsp編譯後產生的class檔案;

三、Tomcat類載入
 Bootstrap($JAVA_HOME/jre/lib/ext/*.jar)
 System($CLASSPATH/*.class和指定的jar)
 Common($CATALINA_HOME/common 下的classes,lib,endores三個子目錄)
 Catalina ($CATALINA_HOME/server/下的classes和lib目錄僅對Tomcat可見)
 &Shared($CATALINA_HOME/shared/下的classes和lib目錄以及$CATALINA_HOME/lib目錄)僅對Web應用程式可見,對Tomcat不可見WebApp($WEBAPP/Web-INF/*僅對該WEB應用可見classes/*.classlib/*.jar)載入類和資源的順序為:
1、/Web-INF/classes
2、/Web-INF/lib/*.jar
3、Bootstrap
4、System
5、$CATALINA_HOME/common/classes
6、$CATALINA_HOME/common/endores/*.jar
7、$CATALINA_HOME/common/lib/*.jar
8、$CATALINA_HOME/shared/classes
9、$CATALINA_HOME/shared/lib/*.jar  四、tomcat的組成server: 代表整個Servlet容器元件,是Tomcat的頂層元素。在<Server>元素中可以包含一個或者多個<Service>元素         1)port 指定一個埠,這個埠負責監聽關閉tomcat的請求 
2)shutdown 指定向埠傳送的命令字串 service:  包含一個<Engine>元素,以及一個或多個<Connector>元素,這些<Connector>原先共享一個<Engine>元素name 指定service的名字 
Connector:代表和客戶程式時間互動的元件,負責接收客戶請求,以及想客戶返回響應結果(表示客戶端和service之間的連線):1)rt 指定伺服器端要建立的埠號,並在這個斷口監聽來自客戶端的請求 
2)inProcessors 伺服器啟動時建立的處理請求的執行緒數 
3)axProcessors 最大可以建立的處理請求的執行緒數 
4)nableLookups 如果為true,則可以通過呼叫request.getRemoteHost()進行DNS查詢來得到遠端客戶端的實際主機名,若為false則不進行DNS查詢,而是返回其ip地址 
5)edirectPort 指定伺服器正在處理http請求時收到了一個SSL傳輸請求後重定向的埠號 
6)ceptCount 指定當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理佇列中的請求數,超過這個數的請求將不予處理7)onnectionTimeout 指定超時的時間數(以毫秒為單位) Engine:每個<Service>只能有一個<Engine>元素。<Engine>元素處理在同一個<Service>中所有<Contector>元素接收到的客戶請求(表示指定service中的請求處理機,接收和處理來自Connector的請求):defaultHost 指定預設的處理請求的主機名,它至少與其中的一個host元素的name屬性值是一樣的 Context:每個<Context>元素代表了執行在虛擬主機上的單個Web應用。在一個<Host>元素中可以包含多個<Context>元素。使用最頻繁(表示一個web應用程式):
1)ocBase 應用程式的路徑或者是WAR檔案存放的路徑 
2)ath 表示此web應用程式的url的字首,這樣請求的url為http://localhost:8080/path/**** 
3)eloadable 這個屬性非常重要,如果為true,則tomcat會自動檢測應用程式的/WEB-INF/lib 和/WEB-INF/classes目錄的變化,自動裝載新的應用程式,我們可以在不重起tomcat的情況下改變應用程式 
host:在一個<Engine>元素中可以包含多個<Host>元素。每個<Host>元素定義了一個虛擬主機,他可以包含一個或多個Web應用(表示一個虛擬主機):
1)name 指定主機名 
2)Base 應用程式基本目錄,即存放應用程式的目錄 
3)npackWARs 如果為true,則tomcat會自動將WAR檔案解壓,否則不解壓,直接從WAR檔案中執行應用程式
Logger (表示日誌,除錯和錯誤資訊):
1)lassName 指定logger使用的類名,此類必須實現org.apache.catalina.Logger 介面 
2)refix 指定log檔案的字首
3)uffix 指定log檔案的字尾
4)imestamp 如果為true,則log檔名中要加入時間,如下例:localhost_log.2001-10-04.txt
Realm (表示存放使用者名稱,密碼及role的資料庫):
className 指定Realm使用的類名,此類必須實現org.apache.catalina.Realm介面 
 Valve (功能與Logger差不多,其prefix和suffix屬性解釋和Logger 中的一樣):
className 指定Valve使用的類名,如用org.apache.catalina.valves.AccessLogValve類可以記錄應用程式的訪問資訊 
 directory(指定log檔案存放的位置):
pattern有兩個值,common方式記錄遠端主機名或ip地址,使用者名稱,日期,第一行請求的字串,HTTP響應程式碼,傳送的位元組數。combined方式比common方式記錄的值更多
五、tomcat的配置檔案構成:
server.xml:主配置檔案;包含Service, Connector, Engine, Realm, Valve, Hosts主元件的相關配置資訊
web.xml:每個webapp只有“部署”後才能被訪問,它的部署方式通常由web.xml進行定義,其存放位置為WEB-INF/目錄中;此檔案為所有的webapps提供預設部署相關的配置;
context.xml:每個webapp都可以專用的配置檔案,它通常由專用的配置檔案context.xml來定義,其存放位置為WEB-INF/目錄中;此檔案為所有的webapps提供預設配置;
tomcat-users.xml:使用者認證的賬號和密碼檔案;
catalina.policy:當使用-security選項啟動tomcat時,用於為tomcat設定安全策略,一般不使用;
catalina.properties:Java屬性的定義檔案,用於設定類載入器路徑,以及一些與JVM調優相關引數;
logging.properties:日誌系統相關的配置;六、Tomcat Server處理一個http請求的過程(工作原理)
假設來自客戶的請求為:http://localhost:8080/wsota/wsota_index.jsp
1) 請求被髮送到本機埠8080,被在那裡偵聽的CoyoteHTTP/1.1 Connector獲得
2) Connector把該請求交給它所在的Service的Engine來處理,並等待來自Engine的迴應
3) Engine獲得請求localhost/wsota/wsota_index.jsp,匹配它所擁有的所有虛擬主機Host
4) Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理,因為該Host被定義為該Engine的預設主機)
5) localhost Host獲得請求/wsota/wsota_index.jsp,匹配它所擁有的所有Context
6) Host匹配到路徑為/wsota的Context(如果匹配不到就把該請求交給路徑名為""的Context去處理)
7) path="/wsota"的Context獲得請求/wsota_index.jsp,在它的mapping table中尋找對應的servlet
8) Context匹配到URLPATTERN為*.jsp的servlet,對應於JspServlet類
9) 構造HttpServletRequest物件和HttpServletResponse物件,作為引數呼叫JspServlet的doGet或doPost方法
10)Context把執行完了之後的HttpServletResponse物件返回給Host
11)Host把HttpServletResponse物件返回給Engine
12)Engine把HttpServletResponse物件返回給Connector
13)Connector把HttpServletResponse物件返回給客戶browser七、執行緒數設定等1.加大tomcat連線數
在tomcat配置檔案server.xml中的<Connector />配置中,和連線數相關的引數有:
 minProcessors:最小空閒連線執行緒數,用於提高系統處理效能,預設值為10
 maxProcessors:最大連線執行緒數,即:併發處理的最大請求數,預設值為75
 acceptCount:允許的最大連線數,應大於等於maxProcessors,預設值為100
 enableLookups:是否反查域名,取值為:true或false。為了提高處理能力,應設定為false
 connectionTimeout:網路連線超時,單位:毫秒。設定為0表示永不超時,這樣設定有隱患的。通常可設定為30000毫秒。
       其中和最大連線數相關的引數為maxProcessors和acceptCount。如果要加大併發連線數,應同時加大這兩個引數。
 web server允許的最大連線數還受制於作業系統的核心引數設定,通常Windows是2000個左右,Linux是1000個左右。2.mcat中如何禁止列目錄下的檔案
在{tomcat_home}/conf/web.xml中,把listings引數設定成false即可3.加大tomcat可以使用的記憶體
tomcat預設可以使用的記憶體為128MB,在較大型的應用專案中,這點記憶體是不夠的,需要調大。
Unix下,在檔案{tomcat_home}/bin/catalina.sh的前面,增加如下設定:
JAVA_OPTS='-Xms【初始化記憶體大小】 -Xmx【可以使用的最大記憶體】'
需要把這個兩個引數值調大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化記憶體為256MB,可以使用的最大記憶體為512MB4.檢視記憶體:檢視Tomcat的JVM記憶體1)omcat6中沒有設定任何預設使用者,因而需要手動往Tomcat6的conf資料夾下的tomcat-users.xml檔案中新增使用者。
    如:<role rolename="manager"/>
           <user username="tomcat" password="tomcat" roles="manager"/>
    注:新增完需要重啟Tomcat6。
2)問http://localhost:8080/manager/status,輸入上面新增的使用者名稱和密碼。
3)然後在如下面的JVM下可以看到記憶體的使用情況。
JVM
    Free memory: 2.50 MB Total memory: 15.53 MB Max memory: 63.56 MB5.區分maxThreads和maxConnections這兩個引數:
maxThreads是指Tomcat執行緒池做多能起的執行緒數,而 maxConnections 則是Tomcat一瞬間做多能夠處理的併發連線數。比如maxThreads=1000,maxConnections=800,假設某一瞬間的併發時1000,那麼最終Tomcat的執行緒數將會是800,即同時處理800個請求,剩餘200進入佇列“排隊”。如果accptCount=100,則有100進入佇列排隊。6.Tomcat的JVM提示記憶體溢位

檢視%TOMCAT_HOME%\logs資料夾下,日誌檔案是否有記憶體溢位錯誤

7.修改server.xml檔案部署這種方式可以不必將PetWeb目錄拷貝到webapps下,直接在F:/部署。方法如下,更改$CATALINA_HOME/conf/server.xml檔案,找到以下內容:xml程式碼:<Context  path ="/Pet"  reloadable ="false"  docBase ="F:/PetWeb"  workDir ="d:/Mywebapps/emp"  />

path:是訪問時的根地址,表示訪問的路徑;如上述例子中,訪問該應用程式地址如下:http://localhost:8080/Pet/

reloadable:表示可以在執行時在classes與lib資料夾下自動載入類包。其中reloadable="false"表示當應用程式 中的內容發生更改之後伺服器不會自動載入,這個屬性在開發階段通常都設為true,方便開發,在釋出階段應該設定為false,提高應用程式的訪問速度。

docbase:表示應用程式的路徑,注意斜槓的方向“/”。 docBase可以使用絕對路徑,也可以使用相對路徑,相對路徑相對於webapps。

workdir:表示快取檔案的放置地址