轉載--詳解tomcat配置

http://www.importnew.com/17124.html  原文連接css

幾乎全部容器類型的應用都會包含一個名爲 server.xml 的文件結構。基本上,其中的每一個元數據或者配置都是容器完成初始化所須要的。正是因爲這些內容都是可配置的,使得軟件設計者或架構師能夠在容器運行時或銷燬時(中止)的狀況下注入須要的服務。明白這一點,其重要性不亞於明白代碼或軟件的工做機制。html

對於這篇文章,咱們將經過分析 server.xml 文件來理解和配置 appache tomcat 服務器。前端

準備工做:java

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

安裝教程能夠點擊這裏mysql

一、Tomcat 安裝目錄

安裝完成 的tomcat,被放在了你的本地存儲中。對於 windows ,一般在 「 Program Files 」 文件夾下,對於 Mac 或者 Linux,可能在 /user/var/opt 或 /User/<>/Application 文件夾下。進入該目錄,能夠看到下面這幾個文件和文件夾:web

  • 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:臨時文件。

二、Tomcat 架構

Tomcat 是一個 HTTP 服務器。也是一個servlet 容器,能夠執行 Java Servlet,將 JavaServer Page(JSP)和 JavaServerFaces(JSF)轉換爲 Java Servlet。Tomcat 採用了層次化和模塊化的架構,以下:sql

圖片1.0 Tomcat 架構數據庫

三、主配置文件(server.xml)

server.xmlapache

「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.一、Server

Server(第二行)是頂級組件,表明一個 Tomcat 實例。能夠包含一個或多個 Services ,其中每一個 Service 都有本身的 Engines 和 Connectors。

1
< Server port = "8005" shutdown = "SHUTDOWN" > ...... </ Server >

3.1.一、基本屬性

  • className:使用 Java 實現類的名稱。這個類必須實現 org.apache.catalina.Server 接口。若是沒有指定類名,將會使用標準實現。
  • address: server 在這個 TCP/IP 地址上監聽一個 shutdown 命令。若是沒有指定地址,將會使用 localhost。
  • port:server 在這個端口上監聽一個 shutdown 命令。設置爲 -1 表示禁用 shutdown 命令。
  • shutdown:鏈接到指定端口的 TCP/IP 收到這個命令字符後,將會關閉 Tomcat。

3.二、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.一、基本屬性

  • 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.三、全局命名資源

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.四、Services

一個 Service 能夠鏈接一個或多個 Connectors 到一個引擎。默認配置定義了一個名爲「Catalina」的 Service ,鏈接了兩個 Connectors:HTTP 和 AJP 到當前的引擎。

1
< Service name = "Catalina" > ...... </ Service >

3.4.一、基本屬性

  • className:該實現使用的 Java 類名稱。這個類必須實現 org.apache.catalina.Service 接口。若是沒有指定類名稱,將會使用標準實現。
  • name:Service 的顯示名稱,若是採用了標準的 Catalina 組件,將會包含日誌信息。每一個 Service 與某個特定的 Server 關聯的名稱必須是惟一的。

3.五、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.六、容器

包含了 Engine、Host、Context和 Cluster 的 Tomcat 稱爲容器。最高級的是 Engine,最底層的是 Context。某些組件,好比 Realm 和 Valve,也能夠放在容器中。

3.七、引擎

引擎是容器中最高級別的部分。能夠包含一個或多個 Host。Tomcat 服務器能夠配置爲運行在多個主機名上,包括虛擬主機。

1
< Engine name = "Catalina" defaultHost = "localhost" />

Catalina 引擎 從 HTTP connector 接收 HTTP 請求,並根據請求頭部信息中主機名或 IP 地址重定向到正確的主機上。

3.7.一、基本屬性

  • 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.八、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.一、基本屬性

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

3.九、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.一、基本屬性

  • 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.十、集羣

Tomcat 支持服務器集羣。它能夠複製整個集羣的會話和上下文屬性。也能夠部署一個 WAR 文件到全部的集羣上。

3.10.一、基本屬性

  • 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.十一、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.一、基本屬性

  • 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 文件的頂層和嵌套級別的元素和屬性,能夠在這裏查看。

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

4.一、包括 server-.xml文件

如今,若是咱們想要爲應用修改 server.xml 文件該怎麼作?不能僅僅由於一個應用修改 server.xml 文件,由於它可能會對全部應用部署的初始化產生影響。對於指定的應用如何隔離指定的變化?

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

server-.xml 是一個自定義的文件,包含了對於一個指定 app 須要隔離的配置變化。全部這種格式的文件都會在 server.xml 文件以後被調用。

4.二、使用自定義的 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 標準容器(廠商),都有相同的配置文件,容許自定義注入和綁定,同時容許在部署、從新部署和卸載時控制哪些服務是有效的。

相關文章
相關標籤/搜索