隨著 Web 項目增多,將所有應用部署在默認 `webapps` 目錄並通過 `server.xml` 配置 `
<Engine name="Catalina" defaultHost="localhost">
<!-- 默認主機保留 -->
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt" pattern="common"/>
</Host>
<!-- 新增虛擬主機:onion -->
<Host name="onion" debug="0" appBase="f:/StudioOnion/WEB_Project"
unpackWARs="true" autoDeploy="true">
<!-- 獨立錯誤日誌 -->
<Logger className="org.apache.catalina.logger.FileLogger"
directory="logs" prefix="onion_log." suffix=".txt" timestamp="true"/>
<!-- 獨立訪問日誌 -->
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="onion_access_log." suffix=".txt"
pattern="common" resolveHosts="false"/>
</Host>
</Engine>
關鍵屬性解析:
在虛擬主機 `appBase` 目錄下為每個項目創建目錄與同名 XML 配置文件:
f:/StudioOnion/WEB_Project/
├── shsc/ # 項目目錄 (含 WEB-INF, JSP, 靜態資源)
└── shsc.xml # Context 配置文件
`shsc.xml` 內容:
<Context path="" docBase="F:/StudioOnion/WEB_Project/shsc" debug="0"
reloadable="true" crossContext="true">
</Context>
127.0.0.1 onion
f:/StudioOnion/WEB_Project/
├── shsc/ # 項目 A
├── shsc.xml
├── crm/ # 項目 B
├── crm.xml
├── erp/ # 項目 C
└── erp.xml
每個項目獨立目錄、獨立 Context XML、獨立類加載器、獨立 Session、獨立日誌 (通過 Host Valve 區分前綴)。
| 現象 | 可能原因 | 解決 |
|---|---|---|
| 404 Not Found | 域名未解析、Host name 不匹配、Context path 錯誤 | 檢查 hosts/DNS、server.xml Host name、Context path |
| 靜態資源 404 | docBase 路徑錯誤、項目結構不標準 (缺少 WEB-INF) | 確認 docBase 指向項目根目錄 (含 WEB-INF/web.xml) |
| Session 共享/丟失 | crossContext 配置、Cluster 未配置、負載均衡 Sticky Session | 單實例無需 Cluster;多實例需配置 Session 複製/持久化 |
| 日誌混亂 | 未配置獨立 Logger/Valve | 每個 Host 配置獨立 AccessLogValve 前綴 |
虛擬主機是 Tomcat 多項目管理的**標準化最佳實踐**。通過 `Host` + `appBase` + 獨立 `Context XML` + 獨立日誌,實現配置解耦、項目隔離、熱部署友好、運行可觀測。生產環境建議進一步採用**多實例部署** (一應用一 Tomcat 進程) 獲取極致隔離與彈性伸縮能力。