1. 程式人生 > >tomcat的Server.xml詳解和Host的配置

tomcat的Server.xml詳解和Host的配置

基於以下說法的領悟:

若只配appBase,不配Context 的docBase(appBase和docBase二選一就可以了),則appBase的每個資料夾裡都代表一個應用,每個應用都必須放ROOT資料夾,ROOT裡則包含web所有檔案,如圖:

 

<host appBase="d:/aaa">
<Context path="/smswap" reloadable="true" docBase="D:\workspace\smswap\WebRoot"></Context>
</host>

我們先看appBase,這個目錄表示:
1 這個目錄下面的子目錄將自動被部署為應用。
2 這個目錄下面的.war檔案將被自動解壓縮並部署為應用

而docBase只是指向了你某個應用的目錄,這個可以和appBase沒有任何關係。

總結:
如果你想自己指定路徑,那麼應該在docBase裡面
如果你想簡單,那麼直接把他們複製到appBase下面就行了

如果你把他們弄重複了,也就是2個指向了一個目錄,看上去也能執行,但你的應用下面的每個子目錄,其實是被部署為單獨的應用的。
比如你的應用為

myApp, 放在了
d:\project\myApp
裡面有2個子目錄
d:\project\myApp\images
d:\project\myApp\js

你可以通過
1 設定 appBase 指向 d:\project 來讓系統自動部署
2 你可以手工指定docBase到 d:\project\myApp
3 如果你指定了 appBase到 d:\project\myApp 那麼
d:\project\myApp\images這個將不再是普通的子目錄,而是一個單獨的虛擬目錄,或者叫應用了。因為其被自動部署

d:\project\myApp\js 也一樣的後果

 

 

 

 

 

---------------------------------------------------------分割線--------------------------------------------------------

 

轉自:http://www.cnblogs.com/gentoo/archive/2012/10/13/2722463.html

 

4、認識 Tomcat 的主配置檔案 server.xml

 

這個檔案位於 tomcat 6 安裝目錄之下的 conf 目錄之內,實際內容位於 /etc/tomcat6/server.xml。

正如該檔案的副檔名所示,這是一個 xml 格式的檔案,開啟之後將會看到如下的結構:

[html]  view plain  copy        
  1. <Server port="8005" shutdown="SHUTDOWN">  
  2.     <Service name="Catalina">  
  3.         <Executor ...... />  
  4.         <Connector ...... />  
  5.         <Connector ...... />  
  6.         <Engine name="Catalina" ... >  
  7.             <Host name="localhost" ... >  
  8.                 <Context ... />  
  9.             </Host>  
  10.         </Engine>  
  11.     </Service>  
  12. </Server>  

 

 

即一個由 Server->Service->Engine->Host->Context 組成的四層結構,從裡層向外層分別是:

  • Context: 即 Web 應用程式,一個 Context 即對於一個 Web 應用程式。
  • Host:即虛擬主機,比如 www.dog.com 對應一個虛擬主機,api.dog.com 對於另一個虛擬主機。一個 Host 用於定義一個虛擬主機。(所謂的”一個虛擬主機”可簡單理解為”一個網站”)
  • Engine:一組虛擬主機的集合。比如www.dog.com 和 api.dog.com 可以組成一組虛擬主機集合。
  • Service:一組 Engine 的集合,包括執行緒池 Executor 和聯結器 Connector 的定義。

CONNECTOR 的配置

一個 Connector 即一個對外界開放的埠,簡單理解就是大部分網路服務程式都會遇到的 IpAddress:Port 的組合,比如 192.168.0.10:8080 就是一個埠,當然在 Connector 裡可以定義的內容要豐富得多,即 Connector 這個 XML 節點裡可以加上許多屬性。下面列舉一下常用的:

  • enableLookups:(default=true) 是否允許反向解析訪客的IP地址,當你的應用程式使用 request.getRemoteHost() 時如果只需要IP地址,建議禁用此項,這樣能節省反向域名解析的時間。
  • maxPostSize:(default=2097152 即2MB) 最大允許 POST 上傳的資料大小(單位為:位元組),對於一般網站來說,比如有寫評論寫文章的網站,預設的2MB已經足夠,不過如果網站帶有圖片甚至檔案上傳功能,則需要根據具體情況來定。
  • protocol:聯結器的型別,tomcat 6 有如下幾種選擇
    • org.apache.coyote.http11.Http11Protocol:簡寫為 “HTTP/1.1″,這是預設的聯結器,一個訪客網路連線需要一個執行緒,併發效能比較低。
    • org.apache.coyote.http11.Http11NioProtocol:NIO聯結器,一個由非阻塞的socket工作模式構成的聯結器,併發效能良好,純Java實現。
    • org.apache.coyote.http11.Http11AprProtocol:APR聯結器,所謂 APR 就是網路上最多伺服器使用的 Web 服務程式 Apache Http Server 所使用的庫,Tomcat 建議在生產環境使用,具體方法下面會介紹。
  • redirectPort:當用戶訪問非https的資源而該資源又需要https方式訪問時,tomcat會自動重定向到https埠,一般https使用 TCP 443埠,所以一般取值”443″。
  • SSLEnabled:(default=false),設定當前聯結器是否使用安全SSL傳輸,如果設定為”true”,則應該同時設定下面兩個屬性: scheme=”https” (default=http) 可以設定為 http 或者 https。 secure=”true” (default=false)。
  • adress:聯結器所繫結的IP地址,當一臺伺服器存在多個ip地址時可以指定其中的需要繫結的一個,預設不設定該屬性的值表示綁定當前伺服器的所有ip地址。
  • compressableMimeType:(default=”text/html,text/xml,text/plain”) 指定需要GZIP壓縮的資源的型別。
  • compression:(default=off) 是否啟用GZIP壓縮,可以取值 on/off/force,設定為on之後會對 compressableMimeType 屬性指定的資源型別啟用GZIP壓縮。
  • connectionTimeout:(default=”60000″) 當訪客網路連線後,伺服器等待第一行Request頭出現的時間。單位是毫秒。
  • executor:指定當前聯結器使用的執行緒池的名稱,如果指定,則忽略其他針對執行緒數量的設定,比如 maxThreads。
  • maxThreads:(default=200) 最多可建立執行緒的數量。
  • port=”80″:繫結埠。
  • keepAliveTimeout:(default=connectionTimeout),訪客完成一次請求後維持網路連線的時間。

一個簡單的 Connector 定義如下:

[html]  view plain  copy        
  1. <Connector port="80" protocol="HTTP/1.1"  
  2.                connectionTimeout="60000"  
  3.            redirectPort="443" />  

EXECUTOR 的配置

Executor 用於定義共享的執行緒池。預設情況下每個 Connector 都會產生自己的一個執行緒池,如果你想多個 Connector 共享一個執行緒池,則可以先定義一個執行緒池,如:

[html]  view plain  copy        
  1. <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"  
  2.         maxThreads="150" minSpareThreads="4"/>  
  3. 然後修改上述的 Connector 配置,增加 executor 屬性,修改後的配置如下:  
  4.   
  5. <Connector executor="tomcatThreadPool"  
  6.                port="80" protocol="HTTP/1.1"  
  7.                connectionTimeout="60000"  
  8.                redirectPort="443" />  

HOST 的配置

一個 Host 配置即為一個虛擬主機,例如下面是一個簡單的 Host 配置:

[html]  view plain  copy        
  1. <Host name="localhost"  appBase="webapps"  
  2.             unpackWARs="true" autoDeploy="true">  
  3.         <Alias>dog.com</Alias>  
  4.         <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"    
  5.                prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>  
  6. </Host>  

 

Host 配置節點各個屬性的作用:

  • name:設定虛擬主機的域名,比如 localhost 表示本機名稱,實際應用時應該填寫具體域名,比如 www.dog.com 或者 dog.com,當然如果該虛擬主機是給內部人員訪問的,也可以直接填寫伺服器的 ip 地址,比如 192.168.1.10。
  • autoDeploy:是否允許自動部署,預設值是 true,即表示 Tomcat 會自動檢測 appBase 目錄下面的檔案變化從而自動應用到正在執行的 Web 應用程式。
  • unpackWARs:設定是否自動展開 war 壓縮包再執行 Web 應用程式,預設值是 true。
  • appBase:設定 Web 應用程式組的路徑。前面說過一個虛擬主機可以由多個 Web 應用程式構成,所以這裡的 appBase 所指向的目錄應該是準備用於存放這一組 Web 應用程式的目錄,而不是具體某個 Web 應用程式的目錄本身(即使該虛擬主機只由一個 Web 應用程式組成)。appBase 屬性的值可以是相對於 Tomcat 安裝目錄的相對路徑,也可以是絕對路徑,需要注意的是該路徑必須是 Tomcat 有許可權訪問的,通過 Arch Linux 源安裝的 Tomcat 是通過 tomcat 使用者執行的,因此建立一個新的 appBase 目錄之後可以使用 chown 命令更改目錄的所有者。

下面舉例說明如何建立一個新的虛擬主機 www.dog.com:

在目錄 /var/lib/tomcat6 下面可以看到安裝 Tomcat 時預設建立的 webapps 目錄,為了方便管理我們即將建立的虛擬主機的文件也在 /var/lib/tomcat6 裡建立:

$ sudo mkdir dog

然後在 dog 目錄裡面建立目錄 ROOT,再在 ROOT 裡面建立檔案 index.html(內容隨便)。

現在將目錄的所有者和所有組都更改為 tomcat:

$ sudo chown -R tomcat:tomcat dog

然後在 server.xml 的 Host 節點下增加如下 Host 節點:

[html]  view plain  copy        
  1. <Host name="www.dog.com"  appBase="/var/lib/tomcat6/dog">  
  2. </Host>  

 

重啟 Tomcat 服務就可以在瀏覽器裡通過地址 http://www.dog.com 訪問這個新建立的虛擬主機了,當然你必須要先在 /etc/hosts 檔案裡增加 www.dog.com 到 127.0.0.1 的解析記錄,如下:

127.0.0.1    www.dog.com

有時一個虛擬主機可能會同時繫結多個域名,比如 www.dog.com 和 dog.com,這時可以通過在 Host 配置節點裡增加 Alias 實現,比如:

[xml]  view plain  copy        
  1. <span style="margin:0px;padding:0px;"><span style="margin:0px;padding:0px;"><Alias<span style="margin:0px;padding:0px;">></span></span></span>dog.com<span style="margin:0px;padding:0px;"><span style="margin:0px;padding:0px;"></Alias<span style="margin:0px;padding:0px;">></span></span></span>  

另外上面示例當中的 <Valve className=… /> 配置了訪客的訪問日誌的儲存位置以及檔名。

ENGINE 的配置

預設的 Engine 節點如下:

[html]  view plain  copy        
  1. <Engine name="Catalina" defaultHost="localhost">  
  2. </Engine>  

 

這個應該不用展開敘述了,其中 defaultHost 用於指定訪客在沒有相應的虛擬主機時,Tomcat 預設選擇的虛擬主機的名稱。考慮如下的情形:

假如有3個域名都 DNS 解析到你的伺服器,比如 dog.com, www.dog.com, api.dog.com,當前你只配置了虛擬主機 dog.com 和 www.dog.com,那麼當有個訪客通過 api.dog.com 訪問你的伺服器時,Tomcat 就會依據 defaultHost 的設定返回其中一個虛擬主機執行的結果。實際應用中 defaultHost 應該設定為你的主力域名,比如 www.dog.com。

5、多站點的配置:設定多個HOST節點

有時我們需要在一臺伺服器上跑多個站點,通過 Tomcat 很容易實現這點,下面假設我們要搭建 www.dog.com 和 www.cat.com 這兩個站點。

首先要確定你的兩個域名的 DNS 已經能正確解析到你的伺服器,因為這裡我們是做實驗,所以可以在本機新增域名解析。修改 /etc/hosts 檔案,加入如下兩行:

127.0.0.1    www.cat.com
127.0.0.1    www.dog.com

然後在 /var/lib/tomcat6 目錄裡分別建立名字為 cat 和 dog 的兩個目錄,然後在每個目錄裡都建立名字為 ROOT 的目錄,並在 ROOT 裡面建立名字為 index.html 檔案(內容隨便)。然後將目錄 cat 和 dog 的所有者和所有組都更改為 tomcat,方法參考上一節,這裡不再贅述。

現在編輯 Tomcat 的主配置檔案 server.xml,在預設的 Host 節點下面再加入如下兩個新的 Host 節點:

[html]  view plain  copy        
  1. <Host name="www.dog.com" appBase="/var/lib/tomcat6/dog" autoDeploy="true" unpackWARs="true">  
  2. </Host>  
  3. <Host name="www.cat.com" appBase="/var/lib/tomcat6/cat" autoDeploy="true" unpackWARs="true">  
  4. </Host>  

在 Host 節點裡面可以根據上一節的說明加入自己需要的屬性或者 Alias 和 Value 子節點。重啟 Tomcat 服務,現在應該可以在瀏覽器裡分別通過 http://www.dog.com 和 http://www.cat.com 瀏覽這兩個站點了。