http://www.importnew.com/17124.html 原文連接css
幾乎全部容器類型的應用都會包含一個名爲 server.xml 的文件結構。基本上,其中的每一個元數據或者配置都是容器完成初始化所須要的。正是因爲這些內容都是可配置的,使得軟件設計者或架構師能夠在容器運行時或銷燬時(中止)的狀況下注入須要的服務。明白這一點,其重要性不亞於明白代碼或軟件的工做機制。html
對於這篇文章,咱們將經過分析 server.xml 文件來理解和配置 appache tomcat 服務器。前端
準備工做:java
安裝教程能夠點擊這裏。mysql
安裝完成 的tomcat,被放在了你的本地存儲中。對於 windows ,一般在 「 Program Files 」 文件夾下,對於 Mac 或者 Linux,可能在 /user/var/opt 或 /User/<>/Application 文件夾下。進入該目錄,能夠看到下面這幾個文件和文件夾:web
catalina.properties
和 logging.properties ,
每一個引擎在conf 目錄下都有一個對應的子目錄,例如Catalina,反過來對於每一個 host 都有一個二級子目錄,好比localhost。能夠將上下文信息配置放在這裏(相似於 context.xml ,可是對於每一個在 host 下的 webapp ,該文件命名爲 webapp.xml )。正則表達式
Catalina
), host name (localhost
), webapp name, followed by the Java classes package structure.Tomcat 是一個 HTTP 服務器。也是一個servlet 容器,能夠執行 Java Servlet,將 JavaServer Page(JSP)和 JavaServerFaces(JSF)轉換爲 Java Servlet。Tomcat 採用了層次化和模塊化的架構,以下:sql
圖片1.0 Tomcat 架構數據庫
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
>
|
Server(第二行)是頂級組件,表明一個 Tomcat 實例。能夠包含一個或多個 Services ,其中每一個 Service 都有本身的 Engines 和 Connectors。
1
|
<
Server
port
=
"8005"
shutdown
=
"SHUTDOWN"
> ...... </
Server
>
|
Server 能夠包含幾個監聽器。一個監聽器監聽指定事件,並對其做出響應。
JasperListener 做用於 Jasper JSP 引擎,該引擎負責對更新後的 JSP 頁面進行重編譯。
1
|
Listener className="org.apache.catalina.core.JasperListener" />
|
GlobalResourcesLifecycleListener 做用於全局資源,保證 JNDI 對資源的可達性,好比數據庫。
1
|
<
Listener
className
=
"org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"
/>
|
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 數據庫。
一個 Service 能夠鏈接一個或多個 Connectors 到一個引擎。默認配置定義了一個名爲「Catalina」的 Service ,鏈接了兩個 Connectors:HTTP 和 AJP 到當前的引擎。
1
|
<
Service
name
=
"Catalina"
> ...... </
Service
>
|
一個 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 協同工做如何配置」。
包含了 Engine、Host、Context和 Cluster 的 Tomcat 稱爲容器。最高級的是 Engine,最底層的是 Context。某些組件,好比 Realm 和 Valve,也能夠放在容器中。
引擎是容器中最高級別的部分。能夠包含一個或多個 Host。Tomcat 服務器能夠配置爲運行在多個主機名上,包括虛擬主機。
1
|
<
Engine
name
=
"Catalina"
defaultHost
=
"localhost"
/>
|
Catalina 引擎 從 HTTP connector 接收 HTTP 請求,並根據請求頭部信息中主機名或 IP 地址重定向到正確的主機上。
一個 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 文件加載到內存)。
一個 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 目錄下的應用。
Tomcat 支持服務器集羣。它能夠複製整個集羣的會話和上下文屬性。也能夠部署一個 WAR 文件到全部的集羣上。
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" />
|
如下是其它一些 valve:
更多信息見於 server.xml 文件的頂層和嵌套級別的元素和屬性,能夠在這裏查看。
如今,若是咱們想要爲應用修改 server.xml 文件該怎麼作?不能僅僅由於一個應用修改 server.xml 文件,由於它可能會對全部應用部署的初始化產生影響。對於指定的應用如何隔離指定的變化?
答案就是:建立一個 server-<name>.xml
server-.xml 是一個自定義的文件,包含了對於一個指定 app 須要隔離的配置變化。全部這種格式的文件都會在 server.xml 文件以後被調用。
不推薦這麼作,但若是想知足下本身好奇心的除外,你能夠經過編輯 catalina.bat 文件來使用你本身的 server.xml 做爲替代。
1
|
catalina.bat start -config confserver-<
name
>.xml
|
總的來說,不管是 serve.xml 仍是你本身的 server-<name>.xml 文件,都是 container 的核心配置。對於應用開發者和發佈管理員來說,是一種在部署 J2EE 應用的容器中放入資源文件的補充策略。其它不管以何種方式實現的 J2EE 標準容器(廠商),都有相同的配置文件,容許自定義注入和綁定,同時容許在部署、從新部署和卸載時控制哪些服務是有效的。