Tomcat 快速入門
版本說明
本文使用 Tomcat 版本為 Tomcat 8.5.24。
Tomcat 8.5 要求 JDK 版本為 1.7 以上。
簡介
Tomcat 是什麼
Tomcat 是由 Apache 開發的一個 Servlet 容器,實作了對 Servlet 和 JSP 的支援,并提供了作為Web伺服器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat閥等。
由于 Tomcat 本身也内含了一個 HTTP 伺服器,它也可以被視作一個單獨的 Web 伺服器。但是,不能将 Tomcat 和 Apache HTTP 伺服器混淆,Apache HTTP 伺服器是一個用 C 語言實作的 HTTP Web 伺服器;這兩個 HTTP web server 不是捆綁在一起的。Tomcat 包含了一個配置管理工具,也可以通過編輯XML格式的配置檔案來進行配置。
Tomcat 重要目錄
- /bin - Tomcat 腳本存放目錄(如啟動、關閉腳本)。
檔案用于 Unix 系統;*.sh
檔案用于 Windows 系統。*.bat
- /conf - Tomcat 配置檔案目錄。
- /logs - Tomcat 預設日志目錄。
- /webapps - webapp 運作的目錄。
web 工程釋出目錄結構
一般 web 項目路徑結構
|-- 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 的壓縮包。
META-INF
:META-INF 目錄用于存放工程自身相關的一些資訊,元檔案資訊,通常由開發工具,環境自動生成。
WEB-INF
:Java web應用的安全目錄。所謂安全就是用戶端無法通路,隻有服務端可以通路的目錄。
/WEB-INF/classes
:存放程式所需要的所有 Java class 檔案。
/WEB-INF/lib
:存放程式所需要的所有 jar 檔案。
/WEB-INF/web.xml
:web 應用的部署配置檔案。它是工程中最重要的配置檔案,它描述了 servlet 群組成應用的其它元件,以及應用初始化參數、安全管理限制等。
安裝
前提條件
進入
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
Server 元素表示整個 Catalina servlet 容器。
是以,它必須是
配置檔案中的根元素。它的屬性代表了整個 servlet 容器的特性。
conf/server.xml
屬性表
屬性 | 描述 | 備注 |
---|---|---|
className | 這個類必須實作org.apache.catalina.Server接口。 | 預設 org.apache.catalina.core.StandardServer |
address | 伺服器等待關機指令的TCP / IP位址。如果沒有指定位址,則使用localhost。 | |
port | 伺服器等待關機指令的TCP / IP端口号。設定為-1以禁用關閉端口。 | |
shutdown | 必須通過TCP / IP連接配接接收到指定端口号的指令字元串,以關閉Tomcat。 |
Service
Service元素表示一個或多個連接配接器元件的組合,這些元件共享一個用于處理傳入請求的引擎元件。Server 中可以有多個 Service。
這個類必須實作 接口。 | 預設 | |
name | 此服務的顯示名稱,如果您使用标準 Catalina 元件,将包含在日志消息中。與特定伺服器關聯的每個服務的名稱必須是唯一的。 |
執行個體 -
conf/server.xml
配置檔案示例
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8080" shutdown="SHUTDOWN">
<Service name="xxx">
...
</Service>
</Server>
Executor
Executor表示可以在Tomcat中的元件之間共享的線程池。
| | |
線程池名稱。 | 要求唯一, 供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
Connector代表連接配接元件。Tomcat 支援三種協定:HTTP/1.1、HTTP/2.0、AJP。
說明 | ||
---|---|---|
asyncTimeout | Servlet3.0規範中的異步請求逾時 | 預設30s |
請求連接配接的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 | 請求連接配接逾時 | |
executor | 指定配置的線程池名稱 | |
keepAliveTimeout | keeAlive逾時時間 | 預設值為connectionTimeout配置值.-1表示不逾時 |
maxConnections | 最大連接配接數 | 連接配接滿時後續連接配接放入最大為acceptCount的隊列中. 對 NIO和NIO2連接配接,預設值為10000;對 APR/native,預設值為8192 |
如果指定了Executor, 此屬性忽略;否則為Connector建立的内部線程池最大值 | ||
如果指定了Executor, 此屬性忽略;否則為Connector建立線程池的最小活躍線程數 | 預設10 | |
processorCache | 協定處理器緩存Processor對象的大小 | -1表示不限制.當不使用servlet3.0的異步處理情況下: 如果配置Executor,配置為Executor的maxThreads;否則配置為Connnector的maxThreads. 如果使用Serlvet3.0異步處理, 取maxThreads和maxConnections的最大值 |
Context
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組成) | |
path | web應用的context path | 如果為根路徑,則配置為空字元串(""), 不能不配置 |
privileged | 是否使用Tomcat提供的manager servlet | |
reloadable | /WEB-INF/classes/ 和/WEB-INF/lib/ 目錄中class檔案發生變化是否自動重新加載 | |
swallowOutput | true情況下, System.out和System.err輸出将被定向到web應用日志中 |
Engine
Engine元素表示與特定的Catalina服務相關聯的整個請求處理機器。它接收并處理來自一個或多個連接配接器的所有請求,并将完成的響應傳回給連接配接器,以便最終傳輸回用戶端。
defaultHost | 預設主機名,用于辨別将處理指向此伺服器上主機名稱但未在此配置檔案中配置的請求的主機。 | 這個名字必須比對其中一個嵌套的主機元素的名字屬性。 |
此引擎的邏輯名稱,用于日志和錯誤消息。 | 在同一伺服器中使用多個服務元素時,每個引擎必須配置設定一個唯一的名稱。 |
Host
Host元素表示一個虛拟主機,它是一個伺服器的網絡名稱(如“www.mycompany.com”)與運作Tomcat的特定伺服器的關聯。
名稱 | 用于日志輸出 | |
appBase | 虛拟主機對應的應用基礎路徑 | 可以是個絕對路徑, 或${CATALINA_BASE}相對路徑 |
xmlBase | 虛拟主機XML基礎路徑,裡面應該有Context xml配置檔案 | |
createDirs | 當appBase和xmlBase不存在時,是否建立目錄 | 預設為true |
autoDeploy | 是否周期性的檢查appBase和xmlBase并deploy web應用和context描述符 | |
deployIgnore | 忽略deploy的正則 | |
deployOnStartup | Tomcat啟動時是否自動deploy | |
配置為true情況下,任何load-on-startup >=0的servlet啟動失敗,則其對應的Contxt也啟動失敗 |
Cluster
由于在實際開發中,我從未用過Tomcat叢集配置,是以沒研究。
啟動
部署方式
這種方式要求本地必須安裝 Tomcat 。
将打包好的 war 包放在 Tomcat 安裝目錄下的
webapps
目錄下,然後在 bin 目錄下執行
startup.bat
或
startup.sh
,Tomcat 會自動解壓
webapps
目錄下的 war 包。
成功後,可以通路
http://localhost:8080/xxx(xxx 是 war 封包件名)。
注意
以上步驟是最簡單的示例。步驟中的 war 包解壓路徑、啟動端口以及一些更多的功能都可以修改配置檔案來定制 (主要是
server.xml
檔案)。
context.xml
嵌入式
API 方式
在 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 插件啟動(不推薦)
不推薦理由:這種方式啟動 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。
(xxx 是 ${project.artifactId} 指定的項目名)。
IDE 插件
常見 Java IDE 一般都有對 Tomcat 的支援。
以 Intellij IDEA 為例,提供了 Tomcat and TomEE Integration 插件(一般預設會安裝)。
使用步驟
- 點選 Run/Debug Configurations > New Tomcat Server > local ,打開 Tomcat 配置頁面。
- 點選 Confiure... 按鈕,設定 Tomcat 安裝路徑。
- 點選 Deployment 标簽頁,設定要啟動的應用。
- 設定啟動應用的端口、JVM 參數、啟動浏覽器等。
- http://localhost:8080/(當然,你也可以在 url 中設定上下文名稱)。
個人認為這個插件不如 Eclipse 的 Tomcat 插件好用,Eclipse 的 Tomcat 插件支援對 Tomcat xml 配置檔案進行配置。而這裡,你隻能自己去 Tomcat 安裝路徑下修改配置檔案。
資料
推薦
文中的嵌入式啟動示例可以參考
我的示例項目