Tomcat詳解,主要是配置方面,各項屬性

四、認識 Tomcat 的主配置文件 server.xml

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

正如該文件的擴展名所示,這是一個 xml 格式的文件,打開以後將會看到以下的結構:web

<Server port="8005" shutdown="SHUTDOWN">
    <Service name="Catalina">
        <Executor ...... />
        <Connector ...... />
        <Connector ...... />
        <Engine name="Catalina" ... >
            <Host name="localhost" ... >
                <Context ... />
            </Host>
        </Engine>
    </Service>
</Server>

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

  • 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 節點裏能夠加上許多屬性。下面列舉一下經常使用的:api

  • 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 定義以下:瀏覽器

<Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="60000"
           redirectPort="443" />

EXECUTOR 的配置

Executor 用於定義共享的線程池。默認狀況下每一個 Connector 都會產生本身的一個線程池,若是你想多個 Connector 共享一個線程池,則能夠先定義一個線程池,如:tomcat

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>

而後修改上述的 Connector 配置,增長 executor 屬性,修改後的配置以下:安全

<Connector executor="tomcatThreadPool"
               port="80" protocol="HTTP/1.1"
               connectionTimeout="60000"
               redirectPort="443" />

HOST 的配置

一個 Host 配置即爲一個虛擬主機,例以下面是一個簡單的 Host 配置:服務器

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Alias>dog.com</Alias>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  
               prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
</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 節點:

<Host name="www.dog.com"  appBase="/var/lib/tomcat6/dog">
</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 實現,好比:

<Alias>dog.com</Alias>

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

ENGINE 的配置

默認的 Engine 節點以下:

<Engine name="Catalina" defaultHost="localhost">
</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。

五、多站點的配置:設置多個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 節點:

<Host name="www.dog.com" appBase="/var/lib/tomcat6/dog" autoDeploy="true" unpackWARs="true">
</Host>
<Host name="www.cat.com" appBase="/var/lib/tomcat6/cat" autoDeploy="true" unpackWARs="true">
</Host>

在 Host 節點裏面能夠根據上一節的說明加入本身須要的屬性或者 Alias 和 Value 子節點。重啓 Tomcat 服務,如今應該能夠在瀏覽器裏分別經過 http://www.dog.com 和 http://www.cat.com 瀏覽這兩個站點了。

六、使用 NIO 鏈接器

默認的鏈接器併發性能不太好,若是網站的併發訪問量不大則無所謂,或者在公司內部網這點可能體會不出來(由於在內部網可能每一個請求在1秒鐘以內就完成了),當環境換成 Internet 以後,可能每一個客戶請求在網絡會幾秒甚至幾十秒的延時才傳輸完成,這樣則會致使「許多訪客同時鏈接」的現象,當 Tomcat 的鏈接器全部線程都被佔用的狀況下,後來者(訪客)就會被卡在門外。所以咱們最好在實際環境中把默認的鏈接器改爲 NIO 鏈接器(non blocking Java connector)。方法很簡單,只要把 Connector 節點的 protocol 屬性值更改成 「org.apache.coyote.http11.Http11NioProtocol」 便可,例如原先的是這樣:

<Connector port="80" protocol="HTTP/1.1"
           redirectPort="443" />

修改成:

<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol"
           redirectPort="443" />

而後重啓 Tomcat 服務器便可。

七、爲網站添加 SSL 證書

有時網站可能涉及重要的業務數據,在互聯網上傳輸這些頁面最好以 https 方式傳輸,這樣能夠防止重要信息被中間環節竊取。

詳細的方法能夠參考我以前的一篇文章《添加 GoDaddy SSL 證書到你的網站》,文章介紹如何申請簽名的 SSL 證書以及如何修改 Tomcat 的配置。若是你如今只是想試驗一下爲網站添加 https 功能,或者只是在公司的內部網站使用上 https,則可使用一個簡單的方法實現:使用自簽名 SSL 證書。所謂自簽名的 SSL 證書就是本身產生的證書,這種證書沒有經過第三方證書商簽名認證,因此在瀏覽這種網站時瀏覽器會提示證書錯誤,不過訪客是徹底能夠繼續瀏覽網站內容。

下面假設咱們要爲上一節的 www.dog.com 添加SSL證書。首先使用 Java 自帶的 keytool 工具產生一個 keystore 文件(一種用於存放證書的文件格式),在自家目錄執行以下命令:

$ keytool -keysize 2048 -genkey -alias tomcat -keyalg RSA -keystore tomcat.keystore

而後它會提示你設置一個密碼以及輸入DN信息:

Enter keystore password:  設置一個用於保護你keystore文件的密碼,例如123456
Re-enter new password: 重複上面的密碼
What is your first and last name?
  [Unknown]:  www.dog.com (就是域名啦)
What is the name of your organizational unit?
  [Unknown]:  Networking 組織單位名稱(隨便)
What is the name of your organization?
  [Unknown]:  dog.com 組織名稱(隨便)
What is the name of your City or Locality?
  [Unknown]:  Shenzhen 所在城市(隨便)
What is the name of your State or Province?
  [Unknown]:  Guangdong 所在省份(隨便)
What is the two-letter country code for this unit?
  [Unknown]:  CN 所在國家的兩位代號(隨便)
Is CN=www.dog.com, OU=Networking, O=dog.com, L=Shenzhen, ST=Guangdong, C=CN correct?
  [no]:  yes 以上信息正確則輸入yes

Enter key password for
    (RETURN if same as keystore password): 這一步直接敲回車

完成後會在當前目錄產生一個 tomcat.keystore 文件。把這個文件複製到 dog 網站應用程序的根目錄(即 /var/lib/tomcat6/dog):

$ sudo cp tomcat.keystore /var/lib/tomcat6/dog

而後修改 Tomcat 的主配置文件 server.xml,在默認的 Connector 節點之下添加以下的新 Connector 節點:

<Connector port="443" protocol="HTTP/1.1″
    SSLEnabled="true"
    scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS"
    keystoreFile="/var/lib/tomcat6/dog/tomcat.keystore"
    keystorePass="123456" />

假如你使用的是 NIO 鏈接器,則應該這樣把 protocol 屬性值換成 Http11NioProtocol,即:

<Connector port="443" protocol="Http11NioProtocol″
    SSLEnabled="true"
    scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS"
    keystoreFile="/var/lib/tomcat6/dog/tomcat.keystore"
    keystorePass="123456" />

重啓 Tomcat 服務,用瀏覽器訪問 https://www.dog.com,這時瀏覽器可能會提示證書錯誤,忽略它(對於 Firefox 瀏覽器還須要點擊 「添加例外」 按鈕才能忽略)便可以看到已是 https 方式在瀏覽網頁了。

八、使用 APR 高性能鏈接器

APR 即 Apache Portable Runtime,提供了 Apache Http 的高性能特性,下面普通鏈接器、NIO和APR的特性簡單比較(摘自這裏):

Java Blocking Connector       Java Nio Blocking Connector       APR Connector
    Classname         Http11Protocol                  Http11NioProtocol         Http11AprProtocol
    Tomcat Version   3.x 4.x 5.x 6.x                       6.x                     5.5.x 6.x
    Support Polling         NO                             YES                        YES
    Polling Size           N/A                   Unlimited - Restricted by mem        Unlimited - Configurable
    Read HTTP Request     Blocking                     Non Blocking                   Blocking
    Read HTTP Body        Blocking                     Sim Blocking                   Blocking
    Write HTTP Response   Blocking                     Sim Blocking                   Blocking
    SSL Support           Java SSL                     Java SSL                       OpenSSL
    SSL Handshake         Blocking                     Non blocking                   Blocking
    Max Connections       maxThreads                   See polling size               See polling size

Tomcat 文檔在 NIO 和 APR 之間比較推薦後者,因爲我沒有實際環境(即大量從 internet 過來的訪問)詳細測試和比較,因此我也不太清楚二者相差多少。下面介紹使用 APR 的方法:

先安裝 APR for Tomcat 的本地庫和 OpenSSL(假如須要使用 SSL 證書而且系統還沒安裝的話),Arch Linux 的 local 源裏面已經存在這二者,因此安裝方法很簡單:

$ sudo pacman -S tomcat-native
$ sudo pacman -S openssl

而後修改 Tomcat 的主配置文件 server.xml,把 Connector 的 protocol 屬性值修改成「org.apache.coyote.http11.Http11AprProtocol」,修改後的配置大體以下:

<Connector port="80" protocol="org.apache.coyote.http11.Http11AprProtocol"
           redirectPort="443" />

(注:保留 protocol=」HTTP/1.1″ 屬性值也是能夠的)

而後重啓 Tomcat 服務便可,如何知道是否用上 APR 鏈接器呢?只要翻查 Tomcat 的日誌文件就知道了,默認的日誌文件爲:/var/log/tomcat6/catalina.err:

$ sudo tail /var/log/tomcat6/catalina.err

若是在重啓 Tomcat 服務後看到日誌末尾處有出現下面紅色字的內容,則表示已經成功用上 APR鏈接器了。

Feb 19, 2012 9:44:05 AM org.apache.coyote.http11.Http11AprProtocol start INFO: Starting Coyote HTTP/1.1 on http-80 Feb 19, 2012 9:44:05 AM org.apache.coyote.http11.Http11AprProtocol start INFO: Starting Coyote HTTP/1.1 on http-443 Feb 19, 2012 9:44:05 AM org.apache.catalina.startup.Catalina start INFO: Server startup in 1281 ms

若是你使用了 APR 鏈接器同時又須要添加 SSL 證書(即須要 https 訪問功能),則須要使用 OpenSSL 的方法產生加密私鑰而且修改一下相應的 Connector 的配置,仍然以上面第7節的例子,即爲 www.dog.com 站點添加 SSL 證書來說解。

先用 OpenSSL 產生私鑰以及自簽名,在自家目錄下執行下面命令:

# Generate private key
$ openssl genrsa -out ca.key 1024 
 
# Generate CSR
$ openssl req -new -key ca.key -out ca.csr
 
# Generate Self Signed Key
$ openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

同上面第7節相似,中途也會要求你輸入 DN 信息,完成後把 ca.crt 和 ca.key 文件複製到 dog 站點應用程序的根目錄:

$ sudo cp ca.crt /var/lib/tomcat6/dog
$ sudo cp ca.key /var/lib/tomcat6/dog

而後修改 Connector 節點爲以下:

<Connector port="443" SSLEnabled="true"
           scheme="https" secure="true"
           SSLCertificateFile="/var/lib/tomcat6/dog/ca.crt"
           SSLCertificateKeyFile="/var/lib/tomcat6/dog/ca.key"/>

重啓 Tomcat 服務以後生效。

最後

此文簡單講述在 Arch Linux 環境下安裝 Tomcat 六、修改主配置文件、搭建多站點、添加 SSL 證書以及使用高性能的 NIO 和 APR 鏈接器的方法和步驟。

相關文章
相關標籤/搜索