天天看點

Tomcat server.xml配置示例

本文由  ImportNew -  飄揚葉 翻譯自  javacodegeeks。歡迎加入 翻譯小組。轉載請見文末要求。

幾乎所有容器類型的應用都會包含一個名為 server.xml 的檔案結構。基本上,其中的每個中繼資料或者配置都是容器完成初始化所需要的。正是由于這些内容都是可配置的,使得軟體設計者或架構師可以在容器運作時或銷毀時(停止)的情況下注入需要的服務。明白這一點,其重要性不亞于明白代碼或軟體的工作機制。

對于這篇文章,我們将通過分析 server.xml 檔案來了解和配置 appache tomcat 伺服器。

準備工作:

  • 安裝 Apache Tomcat 7。(從 apache tomcat 的網站擷取源碼)

安裝教程可以點選這裡。

1、Tomcat 安裝目錄

安裝完成 的tomcat,被放在了你的本地存儲中。對于 windows ,通常在 “ Program Files ” 檔案夾下,對于 Mac 或者 Linux,可能在 /user/var/opt 或 /User/<>/Application 檔案夾下。進入該目錄,可以看到下面這幾個檔案和檔案夾:

  • bin:Tomcat 二進制啟動腳本。
  • conf:應用于所有 webapp 的全局配置。預設會提供如下配置:
    • catalina.policy 提供特殊的安全政策。
    • 兩個 Properties 檔案:

      catalina.properties

       和 

      logging.properties ,

    • 四個 XML 配置檔案:server.xml(Tomcat 主配置檔案)、web.xml(web 應用全局部署描述)、context.xml(Tomcat 特殊配置全局選項)和 tomcat-user.xml(授權和通路控制使用者名,密碼和角色資料庫)。
    每個引擎在conf 目錄下都有一個對應的子目錄,例如Catalina,反過來對于每個 host 都有一個二級子目錄,比如localhost。可以将上下文資訊配置放在這裡(類似于 context.xml ,但是對于每個在 host 下的 webapp ,該檔案命名為 webapp.xml )。
  • lib:確定目錄下的 JAR-file 對于所有 webapp 都有效。預設安裝包括 servlet-api.jar(Servlet),jasper.jar(JSP)和 jasper-el.jar(EL)。外部的 JAR 檔案也可以放在這裡,如 MySQL JDBC 驅動(mysql-connector-java-5.1.{xx}-bin.jar )和 JSTL(jstl.jar 和 standard.jar)。
  • logs:包括引擎日志檔案 Catalina.{yyyy-mm-dd}.log ,host 日志檔案 localhost.{yyyy-mm-dd}.log,和其它應用的日志檔案,如 manager 和 host-manager。通路日志(由 AccessLogValve 建立)也放在這裡。
  • webapps:預設為 appBase – web應用的根目錄。
  • work: contains the translated servlet source files and classes of JSP/JSF. Organized in hierarchy of engine name (

    Catalina

    ), host name (

    localhost

    ), webapp name, followed by the Java classes package structure.
  • temp:臨時檔案。

2、Tomcat 架構

Tomcat 是一個 HTTP 伺服器。也是一個servlet 容器,可以執行 Java Servlet,将 JavaServer Page(JSP)和 JavaServerFaces(JSF)轉換為 Java Servlet。Tomcat 采用了階層化和子產品化的架構,如下:

Tomcat server.xml配置示例

圖檔1.0 Tomcat 架構

3、主配置檔案(server.xml)

server.xml

“server.xml” 是 Tomcat 的主配置檔案,在 <CATALINA_HOME>conf 目錄下可以看到。重構後(删掉注釋和格式化後)的預設”server.xml“檔案如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

<?

xml

version

=

'1.0'

encoding

=

'utf-8'

?>

<

Server

port

=

"8005"

shutdown

=

"SHUTDOWN"

>

<

Listener

className

=

"org.apache.catalina.core.JasperListener"

/>

<

Listener

className

=

"org.apache.catalina.core.AprLifecycleListener"

SSLEngine

=

"on"

/>

<

Listener

className

=

"org.apache.catalina.core.JreMemoryLeakPreventionListener"

/>

<

Listener

className

=

"org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"

/>

<

Listener

className

=

"org.apache.catalina.core.ThreadLocalLeakPreventionListener"

/>

<

GlobalNamingResources

>

<

Resource

name

=

"UserDatabase"

auth

=

"Container"

type

=

"org.apache.catalina.UserDatabase"

description

=

"User database that can be updated and saved"

factory

=

"org.apache.catalina.users.MemoryUserDatabaseFactory"

pathname

=

"conf/tomcat-users.xml"

/>

</

GlobalNamingResources

>

<

Service

name

=

"Catalina"

>

<

Connector

port

=

"8080"

protocol

=

"HTTP/1.1"

connectionTimeout

=

"20000"

redirectPort

=

"8443"

/>

<

Connector

port

=

"8009"

protocol

=

"AJP/1.3"

redirectPort

=

"8443"

/>

<

Engine

name

=

"Catalina"

defaultHost

=

"localhost"

>

<

Realm

className

=

"org.apache.catalina.realm.LockOutRealm"

>

<

Realm

className

=

"org.apache.catalina.realm.UserDatabaseRealm"

resourceName

=

"UserDatabase"

/>

</

Realm

>

<

Host

name

=

"localhost"

appBase

=

"webapps"

unpackWARs

=

"true"

autoDeploy

=

"true"

>

<

Valve

className

=

"org.apache.catalina.valves.AccessLogValve"

directory

=

"logs"

prefix

=

"localhost_access_log."

suffix

=

".txt"

pattern

=

"%h %l %u %t "

%r" %s %b" />

</

Host

>

</

Engine

>

</

Service

>

</

Server

>

3.1、Server

Server(第二行)是頂級元件,代表一個 Tomcat 執行個體。可以包含一個或多個 Services ,其中每個 Service 都有自己的 Engines 和 Connectors。

1

<

Server

port

=

"8005"

shutdown

=

"SHUTDOWN"

> ...... </

Server

>

3.1.1、基本屬性

  • className:使用 Java 實作類的名稱。這個類必須實作 org.apache.catalina.Server 接口。如果沒有指定類名,将會使用标準實作。
  • address: server 在這個 TCP/IP 位址上監聽一個 shutdown 指令。如果沒有指定位址,将會使用 localhost。
  • port:server 在這個端口上監聽一個 shutdown 指令。設定為 -1 表示禁用 shutdown 指令。
  • shutdown:連接配接到指定端口的 TCP/IP 收到這個指令字元後,将會關閉 Tomcat。

3.2、Listeners

Server 可以包含幾個監聽器。一個監聽器監聽指定事件,并對其作出響應。

JasperListener 作用于 Jasper JSP 引擎,該引擎負責對更新後的 JSP 頁面進行重編譯。

1

Listener className="org.apache.catalina.core.JasperListener" />

GlobalResourcesLifecycleListener 作用于全局資源,保證 JNDI 對資源的可達性,比如資料庫。

1

<

Listener

className

=

"org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"

/>

3.2.1、基本屬性

  • SSLEngine:使用的SSLEngine名稱。off:不使用 SSL,on:使用 SSL 但不指定引擎。預設值是 on。會初始化本地 SSL 引擎,對于使用 SSLEnabled 屬性的 APR/native connector 來講,該選項必須可用。
  • SSLRandomSeed:指定僞随機數生成器(PRNG)的随機數種子源,預設值為 builtin。在開發環境下,可能要将其設定為 /dev/urandom , 以獲得更快地啟動速度。
  • FIPSMode:設定為 on 會請求 OpenSSL 進入 FIPS 模式(如果 OpenSSL 已經處于 FIPS 模式,将會保留該模式)。設定為 enter 會強制 OpenSSL 進入 FIPS 模式(如果 OpenSSL 已經處于 FIPS 模式,将會産生一個錯誤)。設定為 require 要求 OpenSSL 已經處于 FIPS 模式(如果 OpenSSL 目前沒有處于 FIPS 模式将會産生一個錯誤)。

3.3、全局命名資源

9到15行的元素定義了 JNDI(Java 命名和目錄接口)資源,其允許 Java 軟體用戶端通過名稱搜尋和查找資料。

預設配置通過10到14行的元素定義了一個名稱為 UserDatabase 的 JNDI,通過”conf/tomcat-users.xml“得到了一個用于使用者授權的記憶體資料庫。

1 2 3 4 5 6 7

<

GlobalNamingResources

>

<

Resource

name

=

"UserDatabase"

auth

=

"Container"

type

=

"org.apache.catalina.UserDatabase"

description

=

"User database that can be updated and saved"

factory

=

"org.apache.catalina.users.MemoryUserDatabaseFactory"

pathname

=

"conf/tomcat-users.xml"

/>

</

GlobalNamingResources

>

你也可以定義其它全局化JNDI資源來實作連接配接池,比如 MySQL 資料庫。

3.4、Services

一個 Service 可以連接配接一個或多個 Connectors 到一個引擎。預設配置定義了一個名為“Catalina”的 Service ,連接配接了兩個 Connectors:HTTP 和 AJP 到目前的引擎。

1

<

Service

name

=

"Catalina"

> ...... </

Service

>

3.4.1、基本屬性

  • className:該實作使用的 Java 類名稱。這個類必須實作 org.apache.catalina.Service 接口。如果沒有指定類名稱,将會使用标準實作。
  • name:Service 的顯示名稱,如果采用了标準的 Catalina 元件,将會包含日志資訊。每個 Service 與某個特定的 Server 關聯的名稱必須是唯一的。

3.5、Connectors

一個 Connector 關聯到一個 TCP 端口,負責處理 Service 與用戶端之間的互動。預設配置定義了兩個 Connectors。

HTTP/1.1:處理 HTTP 請求,使得 Tomcat 成為了一個 HTTP 伺服器。用戶端可以通過 Connector 向伺服器發送 HTTP 請求,接收伺服器端的 HTTP 響應資訊。

1

<

Connector

port

=

"8080"

protocol

=

"HTTP/1.1"

connectionTimeout

=

"20000"

redirectPort

=

"8443"

/>

與生産服務預設使用80端口不同,Tomcat HTTP 服務預設在 TCP 端口8080上運作 。你可以選擇1024到65535之間的任意數字作為端口号來運作 Tomcat 伺服器,前提是該端口沒有被任何其它應用使用。connectionTimeOut 屬性定義了這個 connector 在連結獲得同意之後,獲得請求 URI line(請求資訊)響應的最大等待時間毫秒數。預設為20秒。redirect 屬性會把 SSL 請求重定向到 TCP 的8443端口。AJP/1.3:Apache JServ Protocol connector 處理 Tomcat 伺服器與 Apache HTTP 伺服器之間的互動。

1

<

Connector

port

=

"8009"

protocol

=

"AJP/1.3"

redirectPort

=

"8443"

/>

可以将 Tomcat 和 Apache HTTP 服務運作在一起,Apache HTTP 伺服器處理靜态請求和 PHP;Tomcat 伺服器負責處理 Java Servlet/JSP 。可以參閱“Tomcat 與 Apache 協同工作如何配置”。

3.6、容器

包含了 Engine、Host、Context和 Cluster 的 Tomcat 稱為容器。最進階的是 Engine,最底層的是 Context。某些元件,比如 Realm 和 Valve,也可以放在容器中。

3.7、引擎

引擎是容器中最進階别的部分。可以包含一個或多個 Host。Tomcat 伺服器可以配置為運作在多個主機名上,包括虛拟主機。

1

<

Engine

name

=

"Catalina"

defaultHost

=

"localhost"

/>

Catalina 引擎 從 HTTP connector 接收 HTTP 請求,并根據請求頭部資訊中主機名或 IP 位址重定向到正确的主機上。

3.7.1、基本屬性

  • backgroundProcessorDelay —— 這個值表示了在這個引擎和它的子容器上調用 backgroundProcess 方法之間間隔的秒數,包括所有 host 和 context。值為非負時不會調用子容器(意味着其使用自身的處理線程)。設定為正值會産生一個衍生線程。等待指定的時間之後,該線程會在這個引擎和它的所有子容器上調用 backgroundProcess 方法。如果沒有指定,預設值為10,即會有10秒的延遲。
  • className:實作該引擎使用的 Java 類名。該類必須實作 org.apache.catalina.Engine 接口。如果沒有指定,會使用标準值(下面有定義)。
  • defaultHost:預設主機名,定義了處理指向該伺服器的請求所在主機的名稱,但名稱不是在這個檔案中配置。
  • jvmRoute:在負載均衡場景下必須定義該參數,來保證 session affinity 可用,對于叢集中所有 Tomcat 伺服器來講定義的名稱必須是唯一的, 該名稱将會被添加到生成的會話标示符中,是以,允許前端代理總是将特定會話轉發到同一個 Tomcat 執行個體。
  • name:Engine 的邏輯名稱,用在日志和錯誤資訊中。當在相同的 Server 中使用多個 Service 元素時,每個 Engine 必須指定一個唯一的名稱。
  • startStopThreads:Engine 在啟動 Host 子元素時将會并發使用的線程數目。如果設定為0,将會使用 Runtime.getRuntime().availableProcessors() 的值。設定為負數,将會使用  Runtime.getRuntime().availableProcessors() + value 的值,如果結果小于1,将會使用 1 個線程。如果沒有指定,預設值為 1 。

3.8、Realm

一個 Realm(域)就是一個包含 user、password 和 role 認證(比如通路控制)的資料庫。你可以在任何容器中定義 Realm ,例如 Engine、Host、Context 和 Cluster。

1 2 3

<

Realm

className

=

"org.apache.catalina.realm.LockOutRealm"

>

<

Realm

className

=

"org.apache.catalina.realm.UserDatabaseRealm"

resourceName

=

"UserDatabase"

/>

</

Realm

>

預設配置定義了一個 Catalina Engine 的 Realm(UserDatabaseRealm),對使用者通路 engine 的權限進行控制。其使用定義在 GlobalNamingResources 中,名字為 UserDatabase 的 JNDI。

除了 UserDatabaseRealm 以外,還有:JDBCRealm(授權使用者是否可以通過 JDBC 驅動連結到關系型資料庫);DataSourceRealm(通過 JNDI 連到資料源);JNDIRealm(連接配接到一個 LDAP 目錄)和 MemoryRealm (将 XML 檔案加載到記憶體)。

3.8.1、基本屬性

  • className:使用 Java 實作類的名稱。這個類必須實作 org.apache.catalina.Realm 接口。

3.9、Hosts

一個 Host 定義了在 Engine 下的一個虛拟機,反過來其又支援多個 Context(web 應用)。

1

<

Host

name

=

"localhost"

appBase

=

"webapps"

unpackWARs

=

"true"

autoDeploy

=

"true"

/>

預設配置定義了一個名為 localhost 的主機。appBase 屬性定義了所有 webapp 的根目錄,在這種情況下是 webapps。預設情況下,每一個 webapp 的 URL 和它所在的目錄名稱相同。例如,預設的 Tomcat 安裝目錄的 webapps 下提供了四個 web 應用:docs、examples、host-manager 和 manager。隻有 ROOT 是個例外,它用一個空字元串定義。也就是說,它的 URL 是  http://localhost:8080/。unpackWARs 屬性指定了放到 webapps 目錄下的 WAR-file 是否應該被解壓。對于 unpackWARs=”false“,Tomcat 将會直接從 WAR-file 運作應用,而不解壓,這可能導緻應用運作變慢。autoDeploy 屬性指定了是否自動部署放到 webapps 目錄下的應用。

3.9.1、基本屬性

  • appBase:虛拟機應用的根目錄。該目錄是一個可能包含部署到虛拟機上 web 應用的路徑名。也可能是一個指定的絕對路徑名,或者是一個相對于 $CATALINA_BASE 目錄的路徑名。如果沒有指定,預設會使用 webapps。
  • xmlBase:虛拟機 XML 根目錄。該目錄是一個可能包含部署到虛拟機上context XML 描述符的路徑名。也可能是一個指定的絕對路徑名,或者是一個相對于 $CATALINA_BASE 目錄的路徑名。如果沒有指定,預設會使用 conf/ 目錄。
  • createDirs:如果設定為 true,Tomcat 将會在啟動階段,嘗試建立一個由 appBase 和 xmlBase 屬性定義的目錄。預設值是 true。如果設定為 true ,并且目錄建立失敗,将會列印出一個錯誤資訊,但是不會終止啟動過程。
  • autoDeploy:該屬性的值指明了在 Tomcat 運作的時候,是否需要定時檢查新的或者更新後的 web 應用。如果為 true,Tomcat 會定時檢查 appBase 和 xmlBase 目錄,并對找到的新 web 應用和 context XML 描述符進行部署。更新 web 應用 或 XML 上下文描述符将會觸發 web 應用的重載。預設值為 true。
  • backgroundProcessorDelay:表示在調用這台主機的 backgroundProcess 方法和它的子容器方法,包括所有的 context,之間延遲的秒數。如果延遲值不是負數的話,不會調用子容器(意味着會使用它們自己的處理線程)。設定為正數會産生衍生線程。在等待指定的時間之後,線程将會在該 host 上調用 backgroundProcess 方法,包括它的所有子容器。host将會使用背景程序執行web 應用部署相關的任務。如果沒有指定,預設值為-1,意味着 host 将會依賴于它的父引擎的背景處理線程。
  • className:使用的 Java 實作類的名稱。該類必須實作 org.apache.catalina.Host 接口。
  • deployIgnore:一個正規表達式,定義了在自動部署和啟動時部署的情況下需要忽略的目錄。這就允許你在版本控制系統中保持自己的配置,例如,不會将 .svn 或者 CVS 檔案夾部署到 appBase 目錄下。該正規表達式是相對于 appBase 的。同時也是固定的,意味着是相對于整個檔案或目錄的名稱進行的。是以,foo 隻會比對名稱為 foo 的檔案或目錄,而不會比對foo.war、foobar或者 myfooapp 這樣的名稱。如果想讓“foo”比對任意名稱,可以使用 .*foo.*。
  • deployOnStartup:指定在 Tomcat 啟動時是否需要自動部署host下的 web 應用。預設值為 true。
  • failCtxIfServletStartFails:設定為 true時,如果它的任意一個 load-on-startup>=0 的 servlet 停止自身啟動後,停止啟動它的每一個子 context 。每一個子 context 可能覆寫這個屬性。如果沒有指定,将會使用預設值 false。
  • name:通常是虛拟主機的網絡名稱,注冊在你的域名伺服器上。無論指定的主機名稱是什麼樣的,Tomcat 在内部都會将其轉換為小寫。嵌套在 Engine 内部的 Host ,其中必須有一個 Host 的名稱比對 Engine 的預設 Host 設定。 
  • startStopThreads:Host 在啟動子 Context 元素時會并發使用的線程數。如果自動部署被使用的話将會使用該線程池部署新的 Context。值為0時将會使用 Runtime.getRuntime().availableProcessors() 的值。值為負數時将會使用 Runtime.getRuntime().availableProcessors() 加上該值得和,而和小于1時将會使用1個線程。如果沒有指定,會使用預設值1。
  • undeployOldVersion:該選項的值決定 Tomcat,即自動部署程序部分,是否會檢查并發部署的過時 web 應用,任何找到的應用都會被移除。隻有在 autoDeploy 為 true 的情況下才會生效。如果沒有指定将會使用預設值 false。

3.10、叢集

Tomcat 支援伺服器叢集。它可以複制整個叢集的會話和上下文屬性。也可以部署一個 WAR 檔案到所有的叢集上。

3.10.1、基本屬性

  • className:叢集主類,目前隻有一個是有效的, org.apache.catalina.ha.tcp.SimpleTcpCluster。
  • channelSendOptions: 組通訊(tribe channel)發送選項,預設為8。該選項被用來标志所有的資訊通過 SimpleTcpCluster 發送。該标志指定怎樣發送資訊,是一個簡單的邏輯或。
  • channelStartOptions:設定叢集使用對象的啟動和停止标志。預設是 Channel.DEFAULT,會啟動所有的 channel 服務,包括發送者、接收者、多點傳播發送者群組播接收者。
  • heartbeatBackgroundEnabled:标志是否在容器的背景線程中調用 channel 的心跳檢測。預設是 false。當設定為 true 時,不要忘了禁用 channel 心跳檢測線程。
  • notifyLifecycleListenerOnFailure:當所有的 ClusterListener 不能接收 channel 消息時,該标志位決定是否通知 LifecycleListeners。預設是 false。

3.11、Valve

Valve (閥門)作為請求的前置處理程式,可以在請求發送到應用之前攔截 HTTP 請求。可以定義在任何容器中,比如 Engine、Host、Context和 Cluster。預設配置中,AccessLogValve 會攔截 HTTP 請求,并在日志檔案中建立一個日志切入點,如下:

1 2 3

<

Valve

className

=

"org.apache.catalina.valves.AccessLogValve"

directory

=

"logs"

prefix

=

"localhost_access_log."

suffix

=

".txt"

pattern

=

"%h %l %u %t "

%r" %s %b" />

3.11.1、基本屬性

  • className:設定為 org.apache.catalina.ha.tcp.ReplicationValve
    • filter —— 對于已知檔案擴充名或 url ,可以在請求中使用 Valve 通知 cluster 沒有修改 session,對于本次變化 cluster 沒有必要通知 session 管理者。如果請求比對該過濾器模型,cluster 會假設 session 沒有發生變化。一個filter 樣例大概是這樣的 filter=“.*.gif|.*.js|.*.jpeg|.*.jpg|.*.png|.*.htm|.*.html|.*.css|.*.txt”。filter 使用  java.util.regex 的正規表達式。
  • primaryIndicator:布爾值。如果為 true,replication valve 将會把 primaryIndicatorName 屬性定義的名稱插入到 request 屬性中。該值無論是 Boolean.TRUE 或者 Boolean.FALSE,都會被放入 request 屬性中。
  • primaryIndicatorName:預設值為 org.apache.catalina.ha.tcp.isPrimarySession,這個值定義了一個 request 屬性的名稱,值是一個布爾值,表示會話所在的伺服器是否為主伺服器。
  • statistics:布爾值。如果想讓 valve 收集請求的統計資料,設定為 true。預設值為 false

以下是其它一些 valve:

  • RemoteAddrValve:阻截來自特定的 IP 位址的請求。
  • RemoteHostValve:阻截基于主機名稱的請求。
  • RequestDumperValve:記錄了請求的詳細資訊。
  • SingleSignOn Valve:當置于a下時,允許單點登入到該主機下的所有應用上。

更多資訊見于 server.xml 檔案的頂層和嵌套級别的元素和屬性,可以在這裡檢視。

4、可選配置(server-<name>.xml)

4.1、包括 server-.xml檔案

現在,如果我們想要為應用修改 server.xml 檔案該怎麼做?不能僅僅因為一個應用修改 server.xml 檔案,因為它可能會對所有應用部署的初始化産生影響。對于指定的應用如何隔離指定的變化?

答案就是:建立一個 server-<name>.xml

server-.xml 是一個自定義的檔案,包含了對于一個指定 app 需要隔離的配置變化。所有這種格式的檔案都會在 server.xml 檔案之後被調用。

4.2、使用自定義的 server-<name>.xml 代替 server.xml

不推薦這麼做,但如果想滿足下自己好奇心的除外,你可以通過編輯 catalina.bat 檔案來使用你自己的 server.xml 作為替代。

1

catalina.bat start -config confserver-<

name

>.xml

總的來講,無論是 serve.xml 還是你自己的 server-<name>.xml 檔案,都是 container 的核心配置。對于應用開發者和釋出管理者來講,是一種在部署 J2EE 應用的容器中放入資源檔案的補充政策。其它無論以何種方式實作的 J2EE 标準容器(廠商),都有相同的配置檔案,允許自定義注入和綁定,同時允許在部署、重新部署和解除安裝時控制哪些服務是有效的。

原文連結:  javacodegeeks  翻譯:  ImportNew.com  -  飄揚葉

譯文連結:  http://www.importnew.com/17124.html