網路上關於 Apache-Tomcat 整合的教程動輒十幾個步驟、修改十幾個檔案,實則只需三個核心動作。本文記錄親測最小化配置流程,Windows 環境下 10 分鐘搞定靜動態分離。
| 元件 | 版本 | 關鍵檔案 |
| Apache HTTP Server | 2.0.53 (Win32) | apache_2.0.53-win32-x86-no_ssl.msi |
| Tomcat Servlet Container | 5.5.9 (Win32) | apache-tomcat-5.5.9.exe |
| JK2 連接器 | 2.0.4 | jakarta-tomcat-connectors-jk2-2.0.4-win32-apache2.0.49.zip |
⚠️ 關鍵相容性:JK2 2.0.4 針對 Apache 2.0.49 編譯,但 2.0.53 實測相容。JDK 需 1.4+。
三步驟整合法
步驟 1:安裝基礎元件
- 安裝 JDK 1.4+,設定 `JAVA_HOME`、`PATH`
- 安裝 Apache 2.0.53 (預設 `C:\Program Files\Apache Group\Apache2`)
- 安裝 Tomcat 5.5.9 (預設 `C:\Program Files\Apache Software Foundation\Tomcat 5.5`)
- 解壓 JK2 連接器壓縮包
步驟 2:部署核心模組 (唯一手動複製動作)
# 從 JK2 解壓目錄複製唯一關鍵檔案
copy jakarta-tomcat-connectors-jk2-2.0.4-win32-apache2.0.49\modules\mod_jk2.so ^
"C:\Program Files\Apache Group\Apache2\modules\mod_jk2.so"
步驟 3:兩個配置檔搞定一切
A. 建立 `workers2.properties` (放在 Apache `conf` 目錄)
# 定義 AJP13 通道指向 Tomcat 原生連接埠 8009
[channel.socket:localhost:8009]
port=8009
host=127.0.0.1
# 定義 worker 使用上述通道
[ajp13:localhost:8009]
channel=channel.socket:localhost:8009
# URI 映射規則:/examples/* 請求轉發給 ajp13 worker
[uri:/examples/*]
worker=ajp13:localhost:8009
關鍵說明:`/examples/*` 對應 Tomcat `webapps/examples` 目錄。實際部署時,將此處改為你的應用 Context Path (如 `/myapp/*`),並確保 Tomcat 同名 Context 存在。
B. 修改 Apache `httpd.conf` 尾部新增
# 載入 JK2 模組
LoadModule jk2_module "modules/mod_jk2.so"
# JK2 配置區塊
# 指定 workers2.properties 位置 (相對 ServerRoot)
JkSet config.file conf/workers2.properties
驗證與測試
- 啟動 Tomcat:`%CATALINA_HOME%\bin\startup.bat`
- 啟動 Apache:`%APACHE_HOME%\bin\ApacheMonitor.exe` 或 `httpd -k start`
- 瀏覽器訪問:`https://localhost/examples/`
- 看到 Tomcat Examples 頁面即成功!
進階配置:多應用、虛擬主機、靜態資源分離
多 Context 映射
# workers2.properties 追加
[uri:/app1/*]
worker=ajp13:localhost:8009
[uri:/app2/*]
worker=ajp13:localhost:8009
靜態資源由 Apache 直接服務 (效能優化)
# httpd.conf 新增
Alias /myapp/static "C:/Tomcat/webapps/myapp/static"
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
# 重要:靜態資源路徑排除 JK2 處理
JkSet config.file conf/workers2.properties
# 排除靜態資源
JkMount /myapp/static/* *
JkUnMount /myapp/static/*
虛擬主機隔離
ServerName app1.example.com
JkMount /app1/* ajp13:localhost:8009
ServerName app2.example.com
JkMount /app2/* ajp13:localhost:8009
常見故障排查清單
| 現象 | 可能原因 | 排查步驟 |
| 404 Not Found | Context Path 不匹配 | 檢查 workers2.properties uri 模式、Tomcat webapps 目錄名、server.xml Context path |
| 500 Internal Server Error | mod_jk2 載入失敗 | 檢查 Apache error.log、mod_jk2.so 版本匹配、路徑正確 |
| 連接被拒絕 | Tomcat AJP 埠未啟動 | 檢查 Tomcat server.xml ``、netstat -an | findstr 8009 |
| 中文亂碼 | URI 編碼不一致 | Tomcat server.xml ``、JK2 `JkOptions +ForwardURICompatUnparsed` |
| Session 不共享 | 負載均衡無 Session 複製 | 單 Tomcat 無此問題;叢集需配置 `` 或使用 Sticky Session |
歷史背景:為什麼是 JK2 而非 mod_jk / mod_proxy_ajp?
JK2 (mod_jk2) 是 Jakarta 專案第二代連接器,引入 `workers2.properties` 宣告式配置、通道/Worker 分離模型、更好的效能。但 JK2 於 2005 年停止維護,現代生產環境建議:
- Apache 2.2+:使用 `mod_proxy_ajp` (內建模組,零額外安裝)
- Nginx:`proxy_pass https://tomcat_upstream;` + `upstream` 區塊
- 云原生:Ingress Controller、Service Mesh (Istio/Linkerd)
本文配置僅供教學、維護舊系統、或單機開發環境參考。生產系統請採用現代反向代理方案。
- 上一篇文章: Dom4j 實戰範例:XML 解析與生成的優雅實踐
- 下一篇文章: JPivot 表現層深度解析:Mondrian OLAP 的 XML/XSLT 渲染架構
Copyright ©
程式碼之家 All Rights Reserved