Tomcat 是由 Apache 開發的一個 Servlet 容器,實現了對 Servlet 和 JSP 的支持,並提供了做爲Web服務器的一些特有功能,如Tomcat管理和控制平臺、安全域管理和Tomcat閥等。html
因爲 Tomcat 自己也內含了一個 HTTP 服務器,它也能夠被視做一個單獨的 Web 服務器。可是,不能將 Tomcat 和 Apache HTTP 服務器混淆,Apache HTTP 服務器是一個用 C 語言實現的 HTTP Web 服務器;這兩個 HTTP web server 不是捆綁在一塊兒的。Tomcat 包含了一個配置管理工具,也能夠經過編輯XML格式的配置文件來進行配置。java
*.sh
文件用於 Unix 系統; *.bat
文件用於 Windows 系統。通常 web 項目路徑結構git
|-- webapp # 站點根目錄 |-- META-INF # META-INF 目錄 | `-- MANIFEST.MF # 配置清單文件 |-- WEB-INF # WEB-INF 目錄 | |-- classes # class文件目錄 | | |-- *.class # 程序須要的 class 文件 | | `-- *.xml # 程序須要的 xml 文件 | |-- lib # 庫文件夾 | | `-- *.jar # 程序須要的 jar 包 | `-- web.xml # Web應用程序的部署描述文件 |-- <userdir> # 自定義的目錄 |-- <userfiles> # 自定義的資源文件
webapp
:工程發佈文件夾。其實每一個 war 包均可以視爲 webapp 的壓縮包。github
META-INF
:META-INF 目錄用於存放工程自身相關的一些信息,元文件信息,一般由開發工具,環境自動生成。web
WEB-INF
:Java web應用的安全目錄。所謂安全就是客戶端沒法訪問,只有服務端能夠訪問的目錄。spring
/WEB-INF/classes
:存放程序所須要的全部 Java class 文件。apache
/WEB-INF/lib
:存放程序所須要的全部 jar 文件。瀏覽器
/WEB-INF/web.xml
:web 應用的部署配置文件。它是工程中最重要的配置文件,它描述了 servlet 和組成應用的其它組件,以及應用初始化參數、安全管理約束等。緩存
前提條件tomcat
Tomcat 8.5 要求 JDK 版本爲 1.7 以上。
進入 Tomcat 官方下載地址 選擇合適版本下載,並解壓到本地。
Windows
添加環境變量 CATALINA_HOME
,值爲 Tomcat 的安裝路徑。
進入安裝目錄下的 bin 目錄,運行 startup.bat 文件,啓動 Tomcat
Linux / Unix
下面的示例以 8.5.24 版本爲例,包含了下載、解壓、啓動操做。
# 下載解壓到本地 wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.24/bin/apache-tomcat-8.5.24.tar.gz tar -zxf apache-tomcat-8.5.24.tar.gz # 啓動 Tomcat ./apache-tomcat-8.5.24/bin/startup.sh
啓動後,訪問 http://localhost:8080 ,能夠看到 Tomcat 安裝成功的測試頁面。
本節將列舉一些重要、常見的配置項。詳細的 Tomcat8 配置能夠參考 Tomcat 8 配置官方參考文檔 。
Server 元素表示整個 Catalina servlet 容器。
所以,它必須是
conf/server.xml
配置文件中的根元素。它的屬性表明了整個 servlet 容器的特性。
屬性表
屬性 | 描述 | 備註 |
---|---|---|
className | 這個類必須實現org.apache.catalina.Server接口。 | 默認 org.apache.catalina.core.StandardServer |
address | 服務器等待關機命令的TCP / IP地址。若是沒有指定地址,則使用localhost。 | |
port | 服務器等待關機命令的TCP / IP端口號。設置爲-1以禁用關閉端口。 | |
shutdown | 必須經過TCP / IP鏈接接收到指定端口號的命令字符串,以關閉Tomcat。 |
Service元素表示一個或多個鏈接器組件的組合,這些組件共享一個用於處理傳入請求的引擎組件。Server 中能夠有多個 Service。
屬性表
屬性 | 描述 | 備註 |
---|---|---|
className | 這個類必須實現org.apache.catalina.Service 接口。 |
默認 org.apache.catalina.core.StandardService |
name | 此服務的顯示名稱,若是您使用標準 Catalina 組件,將包含在日誌消息中。與特定服務器關聯的每一個服務的名稱必須是惟一的。 |
實例 - conf/server.xml
配置文件示例
<?xml version="1.0" encoding="UTF-8"?> <Server port="8080" shutdown="SHUTDOWN"> <Service name="xxx"> ... </Service> </Server>
Executor表示能夠在Tomcat中的組件之間共享的線程池。
屬性表
屬性 | 描述 | 備註 |
---|---|---|
className | 這個類必須實現org.apache.catalina.Executor 接口。 |
默認 org.apache.catalina.core.StandardThreadExecutor |
name | 線程池名稱。 | 要求惟一, 供Connector元素的executor屬性使用 |
namePrefix | 線程名稱前綴。 | |
maxThreads | 最大活躍線程數。 | 默認200 |
minSpareThreads | 最小活躍線程數。 | 默認25 |
maxIdleTime | 當前活躍線程大於minSpareThreads時,空閒線程關閉的等待最大時間。 | 默認60000ms |
maxQueueSize | 線程池滿狀況下的請求排隊大小。 | 默認Integer.MAX_VALUE |
<Service name="xxx"> <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="300" minSpareThreads="25"/> </Service>
Connector表明鏈接組件。Tomcat 支持三種協議:HTTP/1.一、HTTP/2.0、AJP。
屬性表
屬性 | 說明 | 備註 |
---|---|---|
asyncTimeout | Servlet3.0規範中的異步請求超時 | 默認30s |
port | 請求鏈接的TCP Port | 設置爲0,則會隨機選取一個未佔用的端口號 |
protocol | 協議. 通常狀況下設置爲 HTTP/1.1,這種狀況下鏈接模型會在NIO和APR/native中自動根據配置選擇 | |
URIEncoding | 對URI的編碼方式. | 若是設置系統變量org.apache.catalina.STRICT_SERVLET_COMPLIANCE爲true,使用 ISO-8859-1編碼;若是未設置此係統變量且未設置此屬性, 使用UTF-8編碼 |
useBodyEncodingForURI | 是否採用指定的contentType而不是URIEncoding來編碼URI中的請求參數 |
如下屬性在標準的Connector(NIO, NIO2 和 APR/native)中有效:
屬性 | 說明 | 備註 |
---|---|---|
acceptCount | 當最大請求鏈接maxConnections滿時的最大排隊大小 | 默認100,注意此屬性和Executor中屬性maxQueueSize的區別.這個指的是請求鏈接滿時的堆棧大小,Executor的maxQueueSize指的是處理線程滿時的堆棧大小 |
connectionTimeout | 請求鏈接超時 | 默認60000ms |
executor | 指定配置的線程池名稱 | |
keepAliveTimeout | keeAlive超時時間 | 默認值爲connectionTimeout配置值.-1表示不超時 |
maxConnections | 最大鏈接數 | 鏈接滿時後續鏈接放入最大爲acceptCount的隊列中. 對 NIO和NIO2鏈接,默認值爲10000;對 APR/native,默認值爲8192 |
maxThreads | 若是指定了Executor, 此屬性忽略;不然爲Connector建立的內部線程池最大值 | 默認200 |
minSpareThreads | 若是指定了Executor, 此屬性忽略;不然爲Connector建立線程池的最小活躍線程數 | 默認10 |
processorCache | 協議處理器緩存Processor對象的大小 | -1表示不限制.當不使用servlet3.0的異步處理狀況下: 若是配置Executor,配置爲Executor的maxThreads;不然配置爲Connnector的maxThreads. 若是使用Serlvet3.0異步處理, 取maxThreads和maxConnections的最大值 |
Context元素表示一個Web應用程序,它在特定的虛擬主機中運行。每一個Web應用程序都基於Web應用程序存檔(WAR)文件,或者包含相應的解包內容的相應目錄,如Servlet規範中所述。
屬性表
屬性 | 說明 | 備註 |
---|---|---|
altDDName | web.xml部署描述符路徑 | 默認 /WEB-INF/web.xml |
docBase | Context的Root路徑 | 和Host的appBase相結合, 可肯定web應用的實際目錄 |
failCtxIfServletStartFails | 同Host中的failCtxIfServletStartFails, 只對當前Context有效 | 默認爲false |
logEffectiveWebXml | 是否日誌打印web.xml內容(web.xml由默認的web.xml和應用中的web.xml組成) | 默認爲false |
path | web應用的context path | 若是爲根路徑,則配置爲空字符串(""), 不能不配置 |
privileged | 是否使用Tomcat提供的manager servlet | |
reloadable | /WEB-INF/classes/ 和/WEB-INF/lib/ 目錄中class文件發生變化是否自動從新加載 | 默認爲false |
swallowOutput | true狀況下, System.out和System.err輸出將被定向到web應用日誌中 | 默認爲false |
Engine元素表示與特定的Catalina服務相關聯的整個請求處理機器。它接收並處理來自一個或多個鏈接器的全部請求,並將完成的響應返回給鏈接器,以便最終傳輸回客戶端。
屬性表
屬性 | 描述 | 備註 |
---|---|---|
defaultHost | 默認主機名,用於標識將處理指向此服務器上主機名稱但未在此配置文件中配置的請求的主機。 | 這個名字必須匹配其中一個嵌套的主機元素的名字屬性。 |
name | 此引擎的邏輯名稱,用於日誌和錯誤消息。 | 在同一服務器中使用多個服務元素時,每一個引擎必須分配一個惟一的名稱。 |
Host元素表示一個虛擬主機,它是一個服務器的網絡名稱(如「www.mycompany.com」)與運行Tomcat的特定服務器的關聯。
屬性表
屬性 | 說明 | 備註 |
---|---|---|
name | 名稱 | 用於日誌輸出 |
appBase | 虛擬主機對應的應用基礎路徑 | 能夠是個絕對路徑, 或${CATALINA_BASE}相對路徑 |
xmlBase | 虛擬主機XML基礎路徑,裏面應該有Context xml配置文件 | 能夠是個絕對路徑, 或${CATALINA_BASE}相對路徑 |
createDirs | 當appBase和xmlBase不存在時,是否建立目錄 | 默認爲true |
autoDeploy | 是否週期性的檢查appBase和xmlBase並deploy web應用和context描述符 | 默認爲true |
deployIgnore | 忽略deploy的正則 | |
deployOnStartup | Tomcat啓動時是否自動deploy | 默認爲true |
failCtxIfServletStartFails | 配置爲true狀況下,任何load-on-startup >=0的servlet啓動失敗,則其對應的Contxt也啓動失敗 | 默認爲false |
因爲在實際開發中,我從未用過Tomcat集羣配置,因此沒研究。
這種方式要求本地必須安裝 Tomcat 。
將打包好的 war 包放在 Tomcat 安裝目錄下的 webapps
目錄下,而後在 bin 目錄下執行 startup.bat
或 startup.sh
,Tomcat 會自動解壓 webapps
目錄下的 war 包。
成功後,能夠訪問 http://localhost:8080/xxx (xxx 是 war 包文件名)。
注意
以上步驟是最簡單的示例。步驟中的 war 包解壓路徑、啓動端口以及一些更多的功能均可以修改配置文件來定製 (主要是
server.xml
或context.xml
文件)。
在 pom.xml 中添加依賴
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>8.5.24</version> </dependency>
添加 SimpleEmbedTomcatServer.java 文件,內容以下:
import java.util.Optional; import org.apache.catalina.startup.Tomcat; public class SimpleTomcatServer { private static final int PORT = 8080; private static final String CONTEXT_PATH = "/javatool-server"; public static void main(String[] args) throws Exception { // 設定 profile Optional<String> profile = Optional.ofNullable(System.getProperty("spring.profiles.active")); System.setProperty("spring.profiles.active", profile.orElse("develop")); Tomcat tomcat = new Tomcat(); tomcat.setPort(PORT); tomcat.getHost().setAppBase("."); tomcat.addWebapp(CONTEXT_PATH, getAbsolutePath() + "src/main/webapp"); tomcat.start(); tomcat.getServer().await(); } private static String getAbsolutePath() { String path = null; String folderPath = SimpleEmbedTomcatServer.class.getProtectionDomain().getCodeSource().getLocation().getPath() .substring(1); if (folderPath.indexOf("target") > 0) { path = folderPath.substring(0, folderPath.indexOf("target")); } return path; } }
成功後,能夠訪問 http://localhost:8080/javatool-server 。
說明
本示例是使用
org.apache.tomcat.embed
啓動嵌入式 Tomcat 的最簡示例。這個示例中使用的是 Tomcat 默認的配置,但一般,咱們須要對 Tomcat 配置進行一些定製和調優。爲了加載配置文件,啓動類就要稍微再複雜一些。這裏不想再貼代碼,有興趣的同窗能夠參考:
不推薦理由:這種方式啓動 maven 雖然最簡單,可是有一個很大的問題是,真的好久好久沒發佈新版本了(最新版本發佈時間:2013-11-11)。且貌似只能找到 Tomcat6 、Tomcat7 插件。
使用方法
在 pom.xml 中引入插件
<plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>8080</port> <path>/${project.artifactId}</path> <uriEncoding>UTF-8</uriEncoding> </configuration> </plugin>
運行 mvn tomcat7:run
命令,啓動 Tomcat。
成功後,能夠訪問 http://localhost:8080/xxx (xxx 是 ${project.artifactId} 指定的項目名)。
常見 Java IDE 通常都有對 Tomcat 的支持。
以 Intellij IDEA 爲例,提供了 Tomcat and TomEE Integration 插件(通常默認會安裝)。
使用步驟
說明
我的認爲這個插件不如 Eclipse 的 Tomcat 插件好用,Eclipse 的 Tomcat 插件支持對 Tomcat xml 配置文件進行配置。而這裏,你只能本身去 Tomcat 安裝路徑下修改配置文件。
File
→ New
→ Dynamic Web Project
Dynamic Web Project
Window
→ Show View
→ Servers
No servers are available. Click ths link to create a new server.
,在彈出的對話框中選擇Tomcat版本 點擊「Finish」完成
返回下方的「Servers」面板,右鍵單擊該面板中的「Tomcat v8.0 Server at localhost」節點,在彈出的快捷菜單中單擊「Start」,便可啓動指定的Web服務器。若是此時直接啓動訪問http://localhost:8080/TomcatTest
,會發現會報404的錯誤。這是由於咱們沒有添加主頁,下面添加主頁(index.jsp)的內容:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>歡迎頁面</title> </head> <body> 歡迎使用eclipse部署Tomcat。 </body> </html>
注意:web資源必定要在WebRoot目錄下添加。如圖:
此時,再一次來訪問該連接:http://localhost:8080/TomcatTest
,效果以下: