| 組件 | 強項 | 弱項 | 整合後分工 |
| Apache (httpd) | 靜態檔案服務、高併發、模組豐富 (Rewrite/SSL/Compress/Security)、成熟穩定 | 不原生支援 JSP/Servlet、Java 生態整合弱 | 前端閘道、靜態服務、SSL 終結、WAF、限流、快取 |
| Tomcat | JSP/Servlet 容器、Java EE 生態、熱部署、JMX 監控 | 靜態檔案處理慢 (經過 JSP 引擎)、配置複雜、併發上限低於 Apache | 後端應用伺服器、專注業務邏輯執行 |
兩大整合模式深度對比
模式一:mod_jk (AJP 1.3 協議) —— 經典、高效、功能全
# httpd.conf
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkMount /servlet/* worker1
JkMount *.jsp worker1
# workers.properties
worker.list=worker1
worker1.type=ajp13
worker1.host=localhost
worker1.port=8009
worker1.lbfactor=1
worker1.cachesize=100
worker1.socket_keepalive=1
worker1.socket_timeout=300
- 優點:AJP 二進制協議輕量、支援負載均衡/故障轉移/會話保持/SSL 客戶端憑證傳遞、成熟穩定。
- 缺點:配置相對複雜、需 Tomcat 啟用 AJP Connector (server.xml)。
模式二:mod_proxy + mod_proxy_ajp / mod_proxy_http —— 現代、通用、易維護
# httpd.conf (Apache 2.4+)
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
# 或 LoadModule proxy_http_module modules/mod_proxy_http.so
ProxyPass /servlet/ ajp://localhost:8009/servlet/
ProxyPassReverse /servlet/ ajp://localhost:8009/servlet/
ProxyPass *.jsp ajp://localhost:8009/
ProxyPassReverse *.jsp ajp://localhost:8009/
# 更通用的 HTTP 代理 (適用於 Spring Boot 內嵌 Tomcat/Jetty/Undertow)
ProxyPass /api/ https://localhost:8080/api/
ProxyPassReverse /api/ https://localhost:8080/api/
- 優點:配置簡潔、統一 Proxy 體系、支援 HTTP/HTTPS 後端、易於微服務網關遷移。
- 缺點:HTTP 代理模式有 Header 解析開銷、AJP 模式功能略弱於 mod_jk。
選型建議
| 場景 | 推薦模式 | 理由 |
| 傳統 Java EE (WAR 部署)、需會話保持/故障轉移/SSL 傳遞 | mod_jk (AJP) | 功能最全、生產驗證最久 |
| Spring Boot / 微服務 / 內嵌容器、統一 HTTP API 網關 | mod_proxy_http | 無需 AJP、配置極簡、雲原生友好 |
| 新專案、團隊熟悉 Proxy 體系、未來可能遷移至 Nginx/Envoy | mod_proxy_ajp | 折中:保留 AJP 效能、用 Proxy 語法 |
Tomcat 端配置 (server.xml)
<!-- AJP Connector (mod_jk / mod_proxy_ajp 必需) -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
maxThreads="200" minSpareThreads="20"
connectionTimeout="20000"
enableLookups="false"
URIEncoding="UTF-8" />
<!-- HTTP Connector (mod_proxy_http / 直接訪問) -->
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="200" minSpareThreads="20"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
compression="on"
compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/json" />
JDK 角色澄清
- JDK = Java Development Kit:包含 JRE + 編譯器 (javac) + 工具 (jconsole, jvisualvm, jstack 等)。
- Tomcat 運行只需 JRE,但生產環境強烈建議安裝 完整 JDK:
- 生產故障需 jstack 導出線程堆疊、jmap 導出堆轉儲、jstat 監控 GC。
- 部分監控工具 (Arthas、Greys、JProfiler) 依賴 JDK 工具模組。
- JDBC 驅動:
mysql-connector-java.jar 等放入 $CATALINA_HOME/lib/,由 Tomcat 類加載器統一管理,非 JDK 自帶。
效能調優關鍵點
- Apache MPM 選擇:Event MPM (Apache 2.4+) > Worker > Prefork。Event 適用於高併發長連接。
- KeepAlive:Apache 啟用
KeepAlive On、MaxKeepAliveRequests 100、KeepAliveTimeout 5,減少握手開銷。
- 靜態資源快取:
mod_expires、mod_headers 設定長期快取 (1 年)、ETag、Vary。
- 壓縮傳輸:
mod_deflate / mod_gzip 壓縮 text/*、application/json、application/javascript。
- Tomcat 線程池:
maxThreads 依 CPU 核心數 × 2-4 設定,監控 currentThreadsBusy 持續 > 80% 時擴容。
- JVM 參數:
-Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+HeapDumpOnOutOfMemoryError。
總結
Apache + Tomcat 整合 = 靜動分離 + 專業分工。
傳統 WAR 選 mod_jk/AJP,現代微服務選 mod_proxy_http。
核心不在「怎麼連」,而在「怎麼監控、怎麼調優、怎麼故障隔離」。建立全鏈路指標 (Apache 存取日誌 → Tomcat 存取日誌 → JVM GC 日誌 → 業務 APM),才是架構師的核心價值。