1. 程式人生 > >Tomcat配置檔案入門

Tomcat配置檔案入門

tomcat讀取配置檔案

首先簡單說一下tomcat是如何讀取配置檔案的。tomcat在啟動時,首先找系統變數CATALINA_BASE,如果沒有,則找CATALINA_HOME。然後找這個變數所指的目錄下的conf資料夾,從中讀取配置檔案。

最重要的配置檔案:server.xml

要配置tomcat,基本上了解server.xml,context.xml和web.xml就可以了。在Tomcat中,都有這幾個檔案的預設檔案,如server.xml的內容如下:
 

The Server Component

  頂層元素為<server>,這個元素對應著Tomcat結構中的server部分。這一行的意思是讓Tomcat在8005埠監聽關閉訊息,如果使用telnet連線8005埠並輸入SHUTDOWN,則tomcat就會關閉。為了安全,tomcat不會接受遠端通過這個埠發的訊息。 <Server>還有一些其他屬性,如果不做配置的話,這些屬性將使用預設值,下面是這些屬性的介紹。
屬性 描述 是否必須?
className 表示server的類,需要實現org.apache.catalina.Server介面。tocmat6預設值使用rg.apache.catalina.core.StandardServer
port 用來監聽shutdown屬性所對應的那個命令,實現關閉tomcat操作的TCP埠。tocmat會檢查連線是否來自同一臺機器,只有同一臺機器(實體地址)發來的訊息才被接受。
shutdown tomcat會監聽port所規定的埠,來接受這個屬性所規定的命令
<Server>還有一些子標籤,內容如下:
屬性 描述 數量
<Service> 包括一組和一個<Engine>相關聯的<Connector>。這些Connector可以併發地接收各種協議的請求,並交給<Engine>來處理 1 or more
<Listener> 用來監聽Server生命週期(start, stop, before start, after start, before stop, after stop)資訊 0 or more
<GlobalNamingResources> 整個tomcat例項都可以使用的JNDI資源 0 or more

The Service Component

Service component包括一組Connector和一個Engine,這些Connector監聽不同埠不同協議的請求,並且這些Connector是併發執行的,Engine則被用來處理這些請求。在預設的server.xml中,service標籤的內容如下: <Service name=”Catalina”> <service>可以有以下屬性:    
屬性 描述 必需?
className service compoent所對應的java類,預設實現org.apache.catalina.core.StandServic
name service的name,通常在administration,management和logging中使用
<service>擁有這些子元素:
子元素 描述 數量
Connector 作用為處理外部的連線請求並將其傳送給Engine處理。一個Connector擁有幾個執行緒和相應資源來處理這些請求。 1 or more
Engine 常用型別有兩種,Catalina和Standalone。Engine是用來處理Connector發過來的請求的。 1

The Connector Component

tomcat6提供了兩種Connector,分別為HTTP/1.1和AJP/1.3。這兩種Connector在預設的server.xml中的配置為:  

The Engine Component

Engine在server.xml中的程式碼如下: 一個Engine就是一個容器,servlet容器。一個Engine可以處理多個虛擬Host(apache中的概念)的請求。當Engine不知該將請求交給那個host時,Engine則將請求轉給defaultHost來處理。 <Engine>的屬性如下表所示:
屬性 描述 必需?
className Engine所對應的java類,預設使用org.apache.catalina.core.StandardEngine
backgroundProcessDelay 單位為秒,在這個屬性所定義的時間之後,此Engine將進入後臺處理。如果該值為負,則直接進入後臺處理。後臺處理一般用於處理低優先順序的任務。    
defaultHost 當Engine找不到請求對應的host時,就使用這個host
jvmRoute 這是tomcat6在負載均衡中使用的識別符號,
name Engine的名稱
作為一個容器,Engine有許多子元素,具體內容如下表:
子元素 描述 數量
Host 每個<Host>元素都表示一個由Engine支配的虛擬主機(virtual host) 1 or more
Context 一組屬性-元素的配置集合。在預設的context定義的屬性可以被Engine中所有的web應用程式所使用。 0 or 1
Realm 用於身份驗證等安全機制,Engine和Context都可以由Realm。如果不指定,則使用Engine的Realm。 0 or 1
Valve Standard Valve用於登陸日誌,請求過濾等 0 or more
Listener 用於tomcat生命週期控制 0 or more

The Realm Component

在預設的server.xml中,Engine中的第一個子標籤就是<Realm>了,其程式碼如下:
 <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
這段程式碼是對一個UserDatabase Realm的配置,它讓預設的web應用程式(manager)載入tomcat-user.xml來進行使用者驗證。 Realm可以從很多其他資料來源獲取驗證資料,而這也正是不同的Realm的不同之處。一般地,Realm可以從這些資料來源獲取使用者驗證資料:
  • 記憶體(memory):使用在記憶體中存放的一個表格進行驗證。這個表格時在tomcat啟動時從一個xml檔案載入到記憶體中的,在這個表格中的資訊格式一般為:使用者名稱/密碼/角色。這種方式一般只用於測試和開發階段,最終產品很少使用這種方式
  • UserDatabase:實現了一個可以修改的、持久的memory Realm,可以向後相容memory Realm。
  • JDBC:使用一個關係資料庫存放使用者驗證資料
  • DataSource:類似於JDBC Realm,使用JNDI的方式來從關係資料庫中拿使用者驗證資料,內容最終還是在一個關係資料庫裡。
  • JNDI:使用JNDI來獲取Realm資料,這些資料一般存放在LDAP目錄下。
  • JAAS:  使用JAAS來獲取使用者驗證資訊

The Host Component

每個Host Component都是一個容器,每個<Host>標籤都表示一個virtual host,在預設的<server.xml>中,Host的配置如下:   這段程式碼的意思是:定義一個名為localhost的虛擬主機,應用程式存放在CATALINA_HOME/webapps目錄中。unpackWARs=“true”讓tomcat在webapps資料夾中發現war檔案時,自動將其解壓。解壓的好處是可以使程式執行更快,不解壓也可以使用。 下圖為virtual host的示意圖 <Host>有這些屬性:
屬性 描述 必需?
className 預設為org. apache.catalina.core.StandardHost
appBase web應用程式檔案存放的位置,相對路徑為CATALINA_HOMEM
autoDeploy 設為true,則web.xml發生變化時,tomcat自動重新部署程式。實現這個功能必需允許後臺處理
name virtual host的名稱
backgroundProcessingDelay 跟Engine中的backgroundProcessingDelay類似
deployOnStartup 若為true,則當這個Engine啟動時,tomcat將自動部署這個host,預設為true
deployXML 這個屬性的目的是為了提高tomcat的安全性,控制web應用程式是否能使用META-INF/contex.xml。如果設為false,則各應用程式只能訪問
$CATALINA_HOME/conf/<engine>/<host>/<app>.xml。預設值為True。
errorReportValveClass 定義host使用的error-reporting Valve,預設值為
org.apache.catalina.valves.ErrorReportValve
unpackWARs tomcat在webapps資料夾中發現war檔案時,是否自動將其解壓
workdir tomcat使用這個目錄來放工作著的servlet和jsp(以servlet形式),這裡面的servlet都是是編譯好的class檔案。預設為$CATALINA_HOME/work
<Host>有這些子標籤
子元素 描述 數量
Context 為了實現伺服器配置和應用程式配置的分離,一般不會在server.xml中設定這個標籤的內容。所有應用程式的配置都可以在$CATALINA_HOME/conf/<engine>/<host>目錄下維護,名稱為:應用程式名.xml。程式設計師可以通過在META-INF目錄下維護自己的context.xml,這個context.xml會被自動以“應用程式名.xml”放到$CATALINA_HOME/conf/<engine>/<host> 0 or more
DefaultContext 當host不知將請求發給哪個context時,就發給它 0 or 1
Realm 這個Host所使用的Realm 0 or 1

Web Application Context Definitions

在tomcat6中,web應用程式的具體配置是在$CATALINA_HOME/conf/<engine name>/<host name>目錄下的“應用程式名.xml”中定義的,在eclipse或netbeans中,使用者可以在META-INF/context.xml中做配置,這些IDE會自動在$CATALINA_HOME/conf/<engine name>/<host name>下建立“應用程式名.xml”檔案。 在war包(或資料夾)的META-INF中的配置檔案叫做嵌入式配置檔案(embedded),預設tomcat在部署時使用這些配置檔案,管理員可以通過修改deployXML屬性來禁止解析這種嵌入式配置檔案。

預設context.xml檔案

在$CATALINA_HOME/conf目錄下的context.xml是tomcat預設的context.xml檔案,tomcat下所有的應用程式都使用這個檔案的配置。因為它是公共的,因此裡面的內容必須是所有web應用程式通用的,預設的context.xml內容只有一行:   在這裡的web.xml被Context的一個後臺程式監視,一旦發生改變,將重新部署這個Context。 context有以下這些屬性:
屬性 描述 必需?
className Context的java類,預設為org.apache.catalina.core.StandardContext
allowLinking 在像linux這種允許符號連結(symbolic link)的作業系統中,這個選項為True則執行該檔案被連結到web應用程式樹之外。在windows中,這個選項必需為false。預設值為false
antiJARLocking 使用特殊的類載入器來儘量避免JAR檔案的鎖定,預設為false。
antiResourceLocking 使用特殊方法來儘量避免檔案鎖定,預設為false。
backgroundProcessDelay 同其他backgroundProcessDelay
catcheMaxSize 設定資原始碼(resource code)的最大值,預設為10240,單位為KB
catcheTTL 驗證cache的間隔時間,單位為微秒,預設值為5000
cachingAllowed 決定靜態資源(配置檔案,圖片等)是否可以載入進cache中,預設為true
caseSensitive 決定tocmat是否進行大小寫檢查,預設為true
cookies 使用cookie來進行session管理,預設為true。如果設為false,則需要使用url重寫的方式維護session
crossContext 當使用ServletContext.getContext()方法時,允許同一個virtual host下的程式跨Context訪問,預設為false
docBase 在這個Context下執行的web應用程式的文件根目錄,通常被稱為Context root。如果web應用程式是以war檔案的方式部署的,那麼這個屬性的預設值為webapps/<name of war file>
override 指示本地的context.xml(war中的META-INF/context.xml)是否可以覆蓋全域性的context.xml(CATALINA_HOME/conf/context.xml),預設值為false
path 表示web應用程式的context路徑。如果你想將這個web應用程式作為此host的預設應用程式,使用這個值:“”;預設值為docBase,war包名,或者應用程式Context檔名
privileged 預設值為false,大部分程式這個值設為false就可以了
processTlds 設定當Context啟動時對TLD進行預處理,預設為true
reloadable 預設值為false。設定tocmat是否應該監視/WEB-INF/classes和/WEB-INF/lib中的變化,如果有發生改變,則自動重新部署
swallowOutput 預設為false。設定System.out和System.error的內容是否應該記錄到日誌檔案中
tldNamespacheAware 設定tld的處理和驗證是否是namespace-aware,預設為false
unloadDelay tomcat等待web應用程式解除安裝的微秒數,預設為2000
unpackWAR 預設為true。設定tomcat自動解壓docBase中的war檔案。
useNaming 預設為true。給web應用程式建立一個JavaEE-JNDI相容的
InitialContext。如果web應用程式使用資料庫連線,這個選項是必需的
workdir 為在這個host中執行的servlet定義一個工作目錄。這個host下的應用程式可以通過javax.servlet.context.tempdir屬性來活動這個目錄的位置。預設為CATALINA_HOME/work
wrapperClass 設定一個實現了org.apache.catalina.Wrapper介面的類r來包裝servlets
<context>有這些子元素:
子元素 描述 數量
Loader 配置用於從一個web應用程式中載入類的ClassLoader 0 or 1
Manager 配置Context的session manager,Session Manager建立,維護並保持伺服器端的session。 0 or 1
Realm 這個Context中執行的web應用程式使用的Realm 0 or 1
Resources 用於獲取resource。使用實現org.apache.naming.resources.FileDirContext介面的類來實現。 0 or 1
WatchedResource 當特定的資源發生改變時,用於通知AutoDeployer對web應用程式進行重新部署 0 or 1

身份驗證和tomcat-users.xml

tomcat-users.xml位於$CATALINA_HOME/conf資料夾下,tomcat6使用這個檔案來對使用manager工具的使用者(也就是管理員)進行身份驗證。tomcat6使用UserDatabase Realm來具體實現這個功能。Realm允許修改載入的資料,並可以通過將這些修改寫回xml的方式來使這些修改持久化。

預設的部署配置檔案--web.xml

根據servlet2.5的標準,任何一個servlet都必須在web.xml中註冊,這個檔案必須以web.xml放到web應用程式的WEB-INF目錄下。這樣可以這個web.xml就只對這個web應用程式有作用。 在$CATALINA_HOME/conf下也有一個web.xml,這個web.xml是這個tomcat例項下所有web應用程式都可以使用的。不過可以在context中修改orverride屬性,來決定各web應用程式的web.xml是否可以覆蓋全域性的web.xml。 下面是預設的全域性web.xml:   與server.xml不同,web.xml可以用schema進行驗證。

預設Server上靜態資源的配置

在下面的<servlet>標籤中,定義了一個預設的servlet。這個預設的servlet是用來處理所有web應用程式的靜態資源請求的,也可以提供目錄展示(directory listing)服務。也就是說,這個servlet相當於一個像apache這樣的http web server。 在預設的web.xml中對預設servlet的配置:  

預設目錄列表和其他使用者自定義配置

如果你不想提供使用者列表功能,可以將下面程式碼段中的true改為false   預設servlet(default servlet)還有這些屬性:
引數 描述
listing 當有到一個目錄的請求時,是否顯示目錄結構,一般設為true。
readonly 控制是否允許PUT,POST等HTTP寫命令
input 讀取資源時的緩衝區大小,一般為2KB
output 寫資源時的緩衝區大小,一般也為2KB
globalXsltFile/localXsltFile 定義一個顯示目錄列表時使用的xslt。
sendfileSize tomcat6支援基於某個具體作業系統平臺的非同步sendfile()。這個值用來設定使用sendfile()方法的閥值,預設為48KB。

配置invoker servlet

invoker servlet是可以通過下面這種方式直接訪問的servlet(沒有引數) http://<host name>/<context path>/servlet/<servlet name> 因為這種方式可以直接訪問servlet,因此存在一定的安全隱患,所以這種方式應該僅在開發和測試階段使用,也正因為這個原因,在tomcat6的預設web.xml中invoker servlet這段配置被註釋了起來:  

配置JspServlet(Jasper)

JspServlet的作用是將jsp檔案轉為servlet。這個servlet一般被人們成為Jasper,Jasper的配置如下:

  Jasper還有以下這些啟動引數:
引數 描述
development 預設值為true,說明jsp檔案還處於開發階段,因此Jasper應該按modificationTestInterval引數對jsp檔案進行檢查,當jsp發生更改時,則對其進行重編譯
fork 預設值為true。指示使用不同的JVM編譯JSP,這樣可以消除資源競爭和在開發階段的類載入器衝突
checkInterval 單位為秒,規定Jasper按這個時間間隔檢查jsp是否需要重編譯,預設為0,指示使用後臺程式處理
modificationTestInterval 主要在development為true時發揮作用,預設值為4。Jasper將按這個頻率檢查jsp檔案是否可以驗證是否修改過。
compiler 讀取資源時使用的快取大小,預設為2KB
classdebuginfo 寫資源時使用的快取大小,預設為2KB
keepgenerated 預設值為true。指示Jasper在兩次呼叫servlet之間在工作目錄中保留那個servlet,這樣可以大大提高tomcat的效率
mappedfilegenStrAsCharArray
dumpSmaptrimSpaces
supressSmap
這些是jsp開發者使用的優化和除錯選項。
scratchDir Jasper在編譯jsp時使用的臨時資料夾,預設為$CATALINA_HOME/work下的一個臨時資料夾
xpoweredBy 預設為false。功能為生成X-Power-By頭(header)
compilerTargetVM 編譯生成的servlet的目標VM
compilerSourceVM 生成servlet的源VM

SSL和CGI Servlet的配置

在預設的web.xml中,這些Servlet的配置被註釋起來了,如果你想在Standalone模式下的Tomcat中新增Apache-styleserver-side include(SSI),那麼這段註釋就應該被移除。   下面的這個配置也是有關使tomcat以Standalone方式處理CGI請求的。  

Servlet Mappings

<servlet-mapping>用來說明如何處理相應的URL請求,如:   規則是這樣的,如果傳進來的url符合/模式,則傳給名為default的Servlet處理。 例如,如果主機名為www.example.com,並且使用Standalone模式執行的tocmat,則下面這個請求將被傳給<servlet-name>為default的Servlet: www.example.com/<context path>/ 如果沒在<Context>中明確標明,則<context path>的值為war檔名 根據前面<servlet>中定義的<servlet-name>對應的servlet,可以知道tomcat將使用org.apache.catalina.servlets.DefaultServlet來處理這個模式的請求 下面的這兩個<servlet-mapping>標籤指示所有包含*.jsp和*.jspx的url都將傳給名為jsp的servlet處理。  

server.xml,context.xml和web.xml是如何一起協同工作的

下面這幅圖是對tomcat處理一個http請求的一個示意

SSI和CGI mappings

在web.xml中,SSI和CGI的<servlet-mapping>的配置被註釋掉了,如果tocmat是在Standalone模式下執行,並且要處理SSI和CGI請求,那麼這幾行註釋可以去掉:  

Session的超時配置

<session-config>標籤配置tomcat6在伺服器端維持一個表示客戶端的session的時間,單位為分鐘。   MIME Mapping  

模擬Apache Web Server:首頁定義

 

catalina.policy:訪問控制檔案

Tomcat6使用的時內建的Java2安全模型,這個安全模型的核心思想是: Any access to system resources that is not explicitly allowed is prohibited. 翻譯過來是:除非明確授權,否則禁止訪問 預設tocmat啟動時是不使用這種安全策略的,除非使用這個引數啟動: > startup -security 在這個檔案中,授予許可權的語法一般是:   這段程式碼賦予所有資源訪問java編譯器所有資源的權利   這段程式碼將Server code,logging code以及API庫的訪問許可權賦予所有資源。 最後這組程式碼是有關web應用程式的預設許可權的。與前面的不同,這裡的限制更加嚴格,因為它們從沒有獲得java.security.AllPermission授權。 第一部分是有關JDBC和JNDI的   第二部分是授予對作業系統資訊的讀許可權 /  第三部分程式碼賦予對一些JVM相關屬性的讀許可權   第四部分是有關JMX的   最後這兩部分是有關XML parser和預編譯JSP的,在編碼階段經常使用  

catalina.properties:更好的訪問控制

tocmat以安全模式啟動時,最後載入的一個檔案就是catalina.properties,這個檔案允許管理員在java package(java 包)一級上進行許可權控制。當有非法請求到達時,java package這一級的控制可以丟擲SecurityException異常。 在catalina.properties中的這幾行程式碼定義了限制訪問的包:   這幾行定義了comon,server和shared的類載入器的路徑:   catalina.properties的最後一行開啟了string cache的使用。這個cache將在ByteChunk.toString()和CharChunk.toString()方法中使用 tomcat.util.buf.StringCache.byte.enabled=true

配置(Configuration)和管理(management)的不同

簡單地說,配置是在Tomcat啟動之前進行的,而管理則是在Tomcat執行過程中進行的。