因爲 Tomcat 基於 Java,實際上在各類 Linux 發行版裏的配置方法都大同小異,只是我看見在 Arch Linux 環境裏搭建 Tomcat 的文章比較少,因此在 Arch Linux 實踐一遍而後得出此文。此文假設你對 Tomcat 並不十分了解,主要筆墨將會在 Tomcat 的配置之上。html
在 Arch Linux 的 extra 源裏有 jdk7-openjdk 和 openjdk6,能夠直接使用 pacman 安裝,至於選用哪個能夠視具體狀況而定。我安裝的是 OpenJDK 7:java
$ sudo pacman -S jdk7-openjdk
一樣地,extra 源裏已有 tomcat 版本五、六、7,能夠根據具體狀況而定,我這裏安裝的是tomcat 6。web
$ sudo pacman -S tomcat6
默認狀況 tomcat 6 安裝路徑爲 /usr/share/tomcat6,這裏羅列一下主要目錄的做用(箭頭表示目錄連接的實際位置):apache
/usr/share/tomcat6: 程序主目錄,也是變量 $CATALINA_HOME 所指向的位置,在單 tomcat 實例的狀況下,也是變量 $CATALINA_BASE 所指向的位置。api
conf -> /etc/tomcat6: 配置文件目錄。瀏覽器
lib -> /usr/share/java/tomcat6: 共享jar包目錄,這些包既給 tomcat 所使用,也能給 web 應用程序所引用。tomcat
logs -> /var/log/tomcat6: 日誌目錄,對於查找錯誤以及查看訪問記錄頗有幫助。安全
webapps -> /var/lib/tomcat6/webapps: 默認的 web 應用程序目錄,tomcat 6 自帶了幾個示例程序,下面會介紹。bash
如今能夠嘗試啓動 tomcat 服務:服務器
$ sudo /etc/rc.d/tomcat start
根據安裝的 Java 運行時的不一樣,啓動時可能有錯誤,檢查啓動腳本的配置文件 /etc/conf.d/tomcat6 裏面的 TOMCAT_JAVA_HOME 變量的值,在個人安裝中 Java 運行時應該在 /opt/java 裏(用 $ which java 就能夠看到了),所以將:
TOMCAT_JAVA_HOME=/usr/lib/jvm/java-7-openjdk 更改成以下便可: TOMCAT_JAVA_HOME=/opt/java
重啓 tomcat 服務:
$ sudo /etc/rc.d/tomcat6 restart
通常應該沒有問題,打開任意瀏覽器並在地址欄裏輸入 「http://localhost:8080″,若是看到 tomcat 貓即說明服務已經安裝穩當而且能正常運行了。
這個目錄位於 tomcat6 的安裝目錄之下,實際內容位於 /var/lib/tomcat6/webapps。 webapps 目錄裏每個目錄對應一個web應用程序,好比 docs 目錄的訪問地址是 http://localhost:8080/docs,同理 manager 目錄的訪問地址是 http://localhost:8080/manager,其中比較特殊的是 ROOT 目錄,它對應的訪問地址剛好是網站的根目錄,即 http://localhost:8080/。
Tomcat 附帶的示例程序能夠逐個訪問體驗一下,其中 manager 和 host-manager 這兩個應用程序設置了須要登陸驗證才能訪問,增長登陸用戶的方法是編輯 Tomcat 安裝目錄下的配置文件 conf/tomcat-users.xml (實際上也是文件 /etc/tomcat6/tomcat-users.xml),添加以下幾行:
<role rolename="manager-gui"/><role rolename="admin-script"/><role rolename="admin-gui"/><user username="tomcat" password="tomcat" roles="manager-gui,admin-script,admin-gui"/>
而後重啓 Tomcat 服務,便可以經過用戶名 tomcat 和密碼 tomcat 登陸並訪問 manager 和 host-manager 兩個應用程序。
每一個 Java Web 應用程序都有以下的目錄結構:
/index.html 訪客直接訪問的資源,好比靜態圖片和CSS樣式表。
/WEB-INF/ 訪客不能直接訪問的資源。
/WEB-INF/classes 應用程序的 Java 源碼編譯後的class文件。
/WEB-INF/web.xml 應用程序的配置文件。
/WEB-INF/lib 應用程序所引用的包。
固然也不是全部都是必須的,你甚至能夠建立一個目錄,好比「hello」,而後在裏面只建立一個 index.html 文件(內容隨便),便可以經過 http://localhost:8080/hello/index.html 訪問了。(固然這樣的不是Web應用程序,此方法僅用於測試用)
下面使用 Apache Maven 建立一個最簡單的 Web 應用程序,在用戶目錄裏執行以下命令建立 Web 應用程序的骨架:
$ mvn archetype:generate
在交互界面中,
Choose a number or apply filter: 輸入 174,即建立 maven-archetype-webapp 類型項目。 Choose version: 輸入5,即版本 1.0。 Define value for property ‘groupId’: 輸入 org.test。 Define value for property ‘artifactId’: 輸入 demo。 Define value for property ‘version’: 輸入 1.0。 Define value for property ‘package’: 輸入 org.test.demo Confirm properties configuration: 直接回車
上面涉及 Maven 知識不在此文的討論範圍,若是不熟悉的話能夠參閱免費的中文電子圖書《Maven in action》,順帶提一下,Maven 是Java項目構建和管理的最經常使用工具之一。
如今應該看到一個名爲 demo 的目錄,進入後可使用 Maven 打包項目:
$ cd demo $ mvn package
打包的結果是文件 ./target/demo.war,把這個文件複製到 webapps 目錄:
$ sudo cp target/demo.war /var/lib/tomcat6/webapps/
因爲 Tomcat 默認建立的站點會自動部署應用程序,因此剛纔複製到 webapps 目錄的文件 demo.war 會被自動解壓縮,檢視 webapps 目錄應該會發現多出一個名字爲 demo 的目錄,如今能夠在瀏覽器裏嘗試訪問 http://localhost:8080/demo,應該看到 「Hello World!」字樣,這就是剛纔用 Maven 建立的 Web 應用程序運行的結果。
須要說明的是,java web 應用程序打包以後所造成的 war 文件並非必定要解壓出來才能運行的,這點將會在下一節的配置裏會講到。
這個文件位於 tomcat 6 安裝目錄之下的 conf 目錄以內,實際內容位於 /etc/tomcat6/server.xml。
正如該文件的擴展名所示,這是一個 xml 格式的文件,打開以後將會看到以下的結構:
<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 組成的四層結構,從裏層向外層分別是:
Context: 即 Web 應用程序,一個 Context 即對於一個 Web 應用程序。
Host:即虛擬主機,好比 www.dog.com 對應一個虛擬主機,api.dog.com 對於另外一個虛擬主機。一個 Host 用於定義一個虛擬主機。(所謂的」一個虛擬主機」可簡單理解爲」一個網站」)
Engine:一組虛擬主機的集合。好比www.dog.com 和 api.dog.com 能夠組成一組虛擬主機集合。
Service:一組 Engine 的集合,包括線程池 Executor 和鏈接器 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 定義以下:
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="60000" redirectPort="443" />
Executor 用於定義共享的線程池。默認狀況下每一個 Connector 都會產生本身的一個線程池,若是你想多個 Connector 共享一個線程池,則能夠先定義一個線程池,如:
<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 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 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。
有時咱們須要在一臺服務器上跑多個站點,經過 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 瀏覽這兩個站點了。
默認的鏈接器併發性能不太好,若是網站的併發訪問量不大則無所謂,或者在公司內部網這點可能體會不出來(由於在內部網可能每一個請求在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 服務器便可。
有時網站可能涉及重要的業務數據,在互聯網上傳輸這些頁面最好以 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 即 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 鏈接器的方法和步驟。