首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

Tomcat 5.x 虛擬主機配置指南:集中管理多項目、簡化 server.xml、實現項目隔離

     編輯:關於JSP

隨著 Web 項目增多,將所有應用部署在默認 `webapps` 目錄並通過 `server.xml` 配置 `` 會導致配置文件膨脹、維護困難、項目間相互影響。本文介紹在 Tomcat 5.x 中配置**虛擬主機** 實現項目集中管理、配置解耦、獨立日誌與訪問控制的完整方案。

虛擬主機架構優勢

  • 配置解耦:每個虛擬主機擁有獨立 `appBase` 目錄與配置文件,`server.xml` 僅保留主機定義。
  • 項目隔離:類加載器隔離、Session 隔離、日誌隔離、安全管理器隔離。
  • 部署靈活:WAR 熱部署、目錄熱部署、Context 配置文件熱加載,無需重啟 Tomcat。
  • 多域名支援:單一 Tomcat 實例支援多域名/子域名/端口映射。

配置步驟全流程

1. 編輯 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>

關鍵屬性解析:

  • `name="onion"`:主機名/域名,需在 DNS/hosts 映射至服務器 IP。
  • `appBase="f:/StudioOnion/WEB_Project"`:虛擬主機應用基目錄,**絕對路徑**,所有項目部署於此。
  • `unpackWARs="true"`:自動解壓 WAR 包為目錄。
  • `autoDeploy="true"`:啟用熱部署(監控 `appBase` 及 Context 配置文件變化)。
  • `Logger`:錯誤日誌文件前綴 `onion_log.`,按天輪轉。
  • `AccessLogValve`:訪問日誌前綴 `onion_access_log.`,Common Log Format。

2. 創建項目專屬 Context 配置文件

在虛擬主機 `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>
  • `path=""`:上下文路徑為空,即 `https://onion/` 直接訪問該項目(根應用)。如需子路徑,設為 `/shsc`。
  • `docBase`:項目物理路徑,**絕對路徑**,與 `appBase` 獨立。
  • `reloadable="true"`:開發環境啟用類熱重載,**生產環境必須設為 false**。
  • `crossContext="true"`:允許 `ServletContext.getContext("/other")` 跨應用訪問。

3. 域名解析與測試

  • 本地測試修改 `C:\Windows\System32\drivers\etc\hosts` (或 `/etc/hosts`):
    127.0.0.1   onion
  • 瀏覽器訪問 `https://onion/` 或 `https://onion/shsc` (視 `path` 而定),看到 JSP 頁面即成功。

進階配置與最佳實踐

多項目部署結構

f:/StudioOnion/WEB_Project/
├── shsc/           # 項目 A
├── shsc.xml
├── crm/            # 項目 B
├── crm.xml
├── erp/            # 項目 C
└── erp.xml

每個項目獨立目錄、獨立 Context XML、獨立類加載器、獨立 Session、獨立日誌 (通過 Host Valve 區分前綴)。

生產環境優化清單

  • ❌ `reloadable="false"` (關閉熱重載,提升性能、防止類加載洩漏)。
  • ✅ `unpackWARs="false"` (生產建議直接部署 WAR,不解壓,節省磁盤 IO、便於版本回滾)。
  • ✅ `autoDeploy="false"` (生產關閉自動部署,通過腳本/管理控制台可控發布)。
  • ✅ 配置 `ErrorReportValve` 友好錯誤頁:``
  • ✅ 啟用 `RemoteAddrValve` 限制管理應用訪問:``
  • ✅ 獨立 JVM 參數:為不同虛擬主機啟動獨立 Tomcat 實例 (多實例模式) 以獲取資源隔離與 GC 隔離。

遷移至 Tomcat 6/7/8/9 注意事項

  • `Logger` 元素已棄用,統一使用 `Valve` (AccessLogValve) + `java.util.logging` / Log4j/Logback 配置日誌。
  • `Context` 配置文件建議放置於 `$CATALINA_BASE/conf/[enginename]/[hostname]/` 目錄 (如 `conf/Catalina/onion/shsc.xml`),而非 `appBase` 目錄。
  • `server.xml` 中 `Engine`/`Host` 結構不變,屬性兼容。

常見問題排查

現象可能原因解決
404 Not Found域名未解析、Host name 不匹配、Context path 錯誤檢查 hosts/DNS、server.xml Host name、Context path
靜態資源 404docBase 路徑錯誤、項目結構不標準 (缺少 WEB-INF)確認 docBase 指向項目根目錄 (含 WEB-INF/web.xml)
Session 共享/丟失crossContext 配置、Cluster 未配置、負載均衡 Sticky Session單實例無需 Cluster;多實例需配置 Session 複製/持久化
日誌混亂未配置獨立 Logger/Valve每個 Host 配置獨立 AccessLogValve 前綴

結語

虛擬主機是 Tomcat 多項目管理的**標準化最佳實踐**。通過 `Host` + `appBase` + 獨立 `Context XML` + 獨立日誌,實現配置解耦、項目隔離、熱部署友好、運行可觀測。生產環境建議進一步採用**多實例部署** (一應用一 Tomcat 進程) 獲取極致隔離與彈性伸縮能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved