轉載:
https://www.cnblogs.com/kismetv/p/7228274.html#title1
http://blog.csdn.net/weinianjie1/article/details/7954425
一、前言
????Tomcat是開源的輕量級Web應用服務器。server.xml中的每個元素都對應tomcat中的一個組件疲恢;通過對xml文件中元素的配置铡溪,可實現(xiàn)對tomcat中各個組件的控制。
二衡蚂、元素分類和整體結構
1.server.xml整體結構
<Server>
????<Service>
????????<Connector/>
????????<Connector/>
????????<Engine>
????????????<Host>
????????????????<context/><!-- 現(xiàn)在常用自動部署窿克,不推薦配置Context元素?-->
????????????</Host>
????????</Engine>
????</Service>
</Server>
2.元素分類
server.xml中的元素可分為以下四類:
1)頂層元素:<Server>和<Service>
<Server>是整個配置文件的根元素,<Service>則代表一個Engine元素及一組與其關聯(lián)的Connector元素毛甲。
2)連接器:<Connector>
代表了外部客戶端發(fā)送請求到特定Service的接口年叮;同時也是外部客戶端從特定Service接受響應的接口。
3)容器:<Engine><Host><Context>
容器的功能是處理Connector接受進來的請求玻募,并產生相應的響應只损。這三者是父子關系。一個Engine可處理Service中的所有請求七咧,一個Host可處理發(fā)向一個特定虛擬主機的所有請求跃惫,一個Context組件可處理一個特定Web應用的所有請求。
4)內嵌組件:可內嵌到容器中的組件艾栋。以上6個是tomcat最核心的組件爆存,其他組件都歸為內嵌組件。
三蝗砾、核心組件
1.Server
代表整個tomcat容器先较。一個Server元素中可以有一個或多個Service元素。Server的主要任務悼粮,就是提供一個接口讓客戶端能訪問到這個Service集合闲勺,同時維護它所包含的所有的Service的生命周期。
shutdown屬性:關閉Server的指令扣猫;
port屬性:Server接受shutdown指令的端口菜循,設為-1可禁掉該端口
2.Service
作用是把Connector和Engine組裝在一起,對外提供服務苞笨。一個Service可包含多個Connector债朵,但只能包含一個Engine;Connector的作用是從客戶端接受請求瀑凝,Engine的作用是處理接受進來的請求序芦。
3.Connector
????主要作用是接受連接請求,創(chuàng)建Request和Response對象用于和請求端交換數(shù)據(jù)粤咪;然后分配線程讓Engine來處理這個請求谚中,并把產生的Request和Response對象傳給Engine。
????通過配置Connector,可控制請求Service的協(xié)議及端口號宪塔。
1)舉例1:
<Connector prot="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>
客戶端可以通過8080端口使用http協(xié)議訪問tomcat磁奖,protocol屬性規(guī)定了請求的協(xié)議,port規(guī)定了請求的端口號某筐,redirectPort表示強制要求https而請求是http時比搭,重定向至端口號為8443的Connector。
2)舉例2:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
客戶端可以通過8009端口使用AJP協(xié)議訪問Tomcat南誊。AJP協(xié)議負責和其他的HTTP服務器(如Apache)建立連接身诺;在把Tomcat與其他HTTP服務器集成時,就需要這個連接器抄囚。
4.Engine
????Engine組件是Service組件中的請求處理組件霉赡。在Service組件中有且只有一個。Engine組件從一個或多個Connector中接受請求并處理幔托,并將完成的響應返回給Connector穴亏,最終傳遞給客戶端。
<Engine name="Catalina" defaultHost="localhost">
name:用于日志和錯誤信息重挑,在整個Server中應該唯一嗓化。
defaultHost:指定了默認的host名稱,當發(fā)往本機的請求指定的host名稱不存在時攒驰,一律使用defaultHost指定的host進行處理蟆湖;因此,defaultHost的值玻粪,必須與Engine中的一個Host組件的name屬性值匹配隅津。
5.Host
1)Engine與Host
Host是Engine的子容器。Engine組件中可以內嵌一個或多個Host組件劲室,每個Host組件代表Engine中的一個虛擬主機伦仍。Host組件至少有一個,且其中一個的name必須與Engine組件的defaultHost屬性相匹配很洋。
2)Host的作用
Host虛擬主機的作用充蓝,是運行多個Web應用(一個Context代表一個Web應用 ),并負責安裝喉磁、展開谓苟、啟動和結束每個Web應用。
Host組件代表的虛擬主機协怒,對應了服務器中一個網絡名實體(如"www.test.com"或IP地址"116.25.25.25")涝焙,為了使用戶可以通過網絡名連接Tomcat服務器,這個名字應該在DNS服務器上注冊孕暇。
客戶端通常用主機名來標識他們希望連接的服務器仑撞;該主機名也會包含在HTTP請求頭中赤兴。Tomcat從HTTP頭中提取主機名,尋找名稱匹配的主機隧哮。如果沒有匹配桶良,請求將轉發(fā)至默認主機。因此默認主機不需要再DNS服務器中注冊沮翔。
3)Host的配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
name:虛擬主機名陨帆。一個Engine中有且僅有一個Host組件的name屬性與Engine組件的defaultHost屬性相匹配;
unpackWARs:是否將代表Web應用的WAR文件解壓鉴竭;true:通過解壓后的文件結構運行該Web應用歧譬;false:直接使用WAR文件運行web應用;
Host的autoDeploy和搏存、APPBase、xmlBase矢洲、deployOnStartup屬性璧眠,與Host內Web應用的自動部署有關。
6.Context
1)Context元素代表在特定虛擬主機上運行的一個Web應用读虏。每個Web應用基于war文件或war文件解壓后對應的目錄责静。
Context是Host的子容器,每個Host可以定義任意多個Context元素盖桥。
2)Web應用自動部署
(1)Host的配置
要開啟Web應用的自動部署灾螃,需要配置所在的虛擬主機;配置方式就是前面提到的Host元素的deployOnStartup和autoDeploy屬性揩徊。如果這倆屬性設為true腰鬼,則tomcat啟動自動部署。二者主要區(qū)別在于塑荒,deployOnStartup為true時熄赡,tomcat在啟動時檢查web應用;autoDeploy為true時齿税,tomcat在運行時定期檢查新的web應用或web應用的更新彼硫。
自動部署依賴于檢查是否有新的或更改過的web應用,而Host元素的appBase和xmlBase設置了檢查web應用更新的目錄凌箕。
appBase:指定web應用所在的目錄拧篮,默認值是webapps,這是一個相對路徑牵舱。
xmlBase:指定web應用的XML配置文件所在的目錄串绩。默認值為conf/<engine_name>/<host_name>。
(2)檢查web應用更新
一個web應用可能包含以下文件:XML配置文件仆葡,WAR包固惯,以及一個應用目錄(該目錄包含Web應用的文件結構);其中XML文件位于xmlBase指定的目錄徘郭,WAR包和應用目錄位于appBase指定的目錄嗦锐。tomcat會掃描這倆屬性配置的目錄來檢查應用更新。
(3)<Context>元素的配置
docBase:指定web應用使用的war包路徑父能,或應用目錄。需注意的是:在自動部署場景下(配置文件位于xmlBase中),docBase不在appBase目錄中紊浩,才需要指定。
path:指定了訪問該web應用的上下文路徑疗锐,當請求到來時坊谁,tomcat根據(jù)web應用的path屬性與URI的匹配程度來選擇web應用處理相應請求。如果一個Context元素的path屬性為""滑臊,則這個Context是虛擬主機的默認web應用口芍;當請求的URI與所有path都不匹配時,使用該默認web應用來處理雇卷。
需要注意的是鬓椭,在自動部署場景下(配置文件位于xmlBase中),不能指定path屬性关划,path屬性由配置文件的文件名小染、war文件的文件名或應用目錄的名稱自動推導出來。如掃描web應用時贮折,發(fā)現(xiàn)了xmlBase目錄下的app1.xml裤翩,或appBase目錄下的app1.war或app1應用目錄,則該web應用的path屬性為"app1"调榄。如果名稱不是app1而是ROOT踊赠,則該web應用是虛擬主機默認的web應用,此時path屬性推導為""振峻。
reloadable:指示tomcat是否在運行時監(jiān)控在WEB-INF/classes和WEB-INF/lib目錄下的class文件的改動臼疫。若為true,則當class文件改動時會觸發(fā)web應用重新加載扣孟。開發(fā)環(huán)境設為true方便調試烫堤;生產環(huán)境設為true會給服務器帶來性能壓力。
(4)自動部署舉例
最典型的自動部署凤价,就是當我們安裝完tomcat后鸽斟,在webapps目錄下有如下文件夾:
當啟動tomcat后,可用http://localhost:8080/來訪問tomcat利诺,其實訪問的就是ROOT對應的web應用富蓄;也可通過http://localhost:8080/docs來訪問docs應用,同理可訪問examples/host-manager/這幾個web應用慢逾。
http://localhost:8080/:ROOT是tomcat中的一個項目立倍,最后的“/”表示http的根-ROOT灭红。
3)server.xml中靜態(tài)部署web應用
除了自動部署,我們也可以在server.xml中通過<context>元素靜態(tài)部署Web應用口注。靜態(tài)部署和自動部署是可以共存的变擒。因為server.xml不可動態(tài)加載資源,服務器一旦啟動寝志,要修改這個文件就得重啟服務器才能重新加載娇斑。而自動部署可以在tomcat運行時通過定期的掃描來實現(xiàn),不需重啟服務器材部。
<Context path="/" docBase="D:\Program Files\app1.war" reloadable="true"/>
docBase:靜態(tài)部署時毫缆,docBase可以在appBase目錄下,也可不在乐导。
path:靜態(tài)部署時苦丁,可顯示指定path屬性,但仍受到嚴格限制:只有當自動部署關閉(deployOnStartup和autoDeploy都為false)或docBase不在appBase中時物臂,才可設置path芬骄。
reloadable:用法與自動部署時相同。
四鹦聪、配置多個服務
通過在Server中配置多個Service服務,可以實現(xiàn)通過不同的端口號來訪問同一臺機器上部署的不同Web應用蒂秘。
五泽本、其他組件
1.Listener
監(jiān)聽器∫錾可在特定事件發(fā)生時執(zhí)行特定的操作规丽;被監(jiān)聽事件通常是tomcat的啟動和停止。
<Listener className=""/>
2.GlobalNamingResources與Realm
Realm撇贺,可以把它理解成“域”赌莺;Realm提供了一種用戶密碼與web應用的映射關系,從而達到角色安全管理的作用松嘶。
3.valve
閥門艘狭。在Tomcat中代表了請求處理流水線上的一個組件;Valve可以與Tomcat的容器(Engine翠订、Host或Context)關聯(lián)巢音。
不同的Valve有不同的特性,下面介紹一下本例中出現(xiàn)的AccessLogValve尽超。
AccessLogValve的作用是通過日志記錄其所在的容器中處理的所有請求官撼,在本例中,Valve放在Host下似谁,便可以記錄該Host處理的所有請求傲绣。AccessLogValve記錄的日志就是訪問日志掠哥,每天的請求會寫到一個日志文件里。AccessLogValve可以與Engine秃诵、Host或Context關聯(lián)续搀;在本例中,只有一個Engine顷链,Engine下只有一個Host目代,Host下只有一個Context,因此AccessLogValve放在三個容器下的作用其實是類似的嗤练。
本例的AccessLogValve屬性的配置榛了,使用的是默認的配置;下面介紹AccessLogValve中各個屬性的作用:
(1)className:規(guī)定了Valve的類型煞抬,是最重要的屬性霜大;本例中,通過該屬性規(guī)定了這是一個AccessLogValve革答。
(2)directory:指定日志存儲的位置战坤,本例中,日志存儲在$TOMCAT_HOME/logs目錄下残拐。
(3)prefix:指定了日志文件的前綴途茫。
(4)suffix:指定了日志文件的后綴。通過directory溪食、prefix和suffix的配置囊卜,在$TOMCAT_HOME/logs目錄下,可以看到如下所示的日志文件错沃。
(5)pattern:指定記錄日志的格式
pattern的配置中栅组,有一個非常有用的選項是%D,含義是請求處理的時間(單位是毫秒)枢析,對于統(tǒng)計分析請求的處理速度幫助很大玉掸。
開發(fā)人員可以充分利用訪問日志,來分析問題醒叁、優(yōu)化應用司浪。例如,分析訪問日志中各個接口被訪問的比例辐益,不僅可以為需求和運營人員提供數(shù)據(jù)支持断傲,還可以使自己的優(yōu)化有的放矢;分析訪問日志中各個請求的響應狀態(tài)碼智政,可以知道服務器請求的成功率认罩,并找出有問題的請求;分析訪問日志中各個請求的響應時間续捂,可以找出慢請求垦垂,并根據(jù)需要進行響應時間的優(yōu)化宦搬。
六、關于用tomcat部署多個應用的3種方法:
1.配置文件中使用多個Context元素劫拗。這種配置好處是這些應用公用Connector间校,也就是說訪問端口是一樣的,這樣就可以都部署在80下了页慷。
這樣有一個要求憔足,就是應用程序在設計的時候就支持Context,一些鏈接前面都先加上動態(tài)的應用名酒繁,而不是使用“/”這樣的絕對路徑滓彰。Context元素的path一定不要以“/”結尾,可以是""或者"/WEB1"這樣的州袒。
2.配置文件中使用多個Service元素揭绑。這種配置可以解決應用程序不支持動態(tài)應用名的情況,使用不同端口訪問不同頁面郎哭。
不過這樣有時候也不是很順利他匪,由于一個tomcat的jvm對一個jni類只允許load一次,你多個應用如果同時load了某個jni的類則會部署失敗夸研。這種情況可以把這個類從項目里拿出來放到tomcat安裝目錄的lib下作為公用的邦蜜。不過還是有點麻煩哈~
3.部署多個tomcat。這個一般是做集群的時候用的亥至,不過你也可以用來部署多應用畦徘,只要調整下端口不沖突就行。