Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> 電腦軟體教學 >> 伺服器技術 >> 關於伺服器

Apache 與 Tomcat 整合深度解析:靜動分離、AJP/Proxy 兩大模式、架構選型指南

編輯:關於伺服器

核心關係圖譜

用戶請求 → Apache (Port 80/443) 
    ├─ 靜態資源 (.html/.css/.js/.jpg/.png) → Apache 直接服務 (極快、高併發)
    └─ 動態請求 (/servlet/*、/*.jsp、/api/*) → 轉發 → Tomcat (Port 8080/8009)
           Tomcat 執行 JSP/Servlet → 生成 HTML → 返回 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。

選型建議

組件強項弱項整合後分工
Apache (httpd)靜態檔案服務、高併發、模組豐富 (Rewrite/SSL/Compress/Security)、成熟穩定不原生支援 JSP/Servlet、Java 生態整合弱前端閘道、靜態服務、SSL 終結、WAF、限流、快取
TomcatJSP/Servlet 容器、Java EE 生態、熱部署、JMX 監控靜態檔案處理慢 (經過 JSP 引擎)、配置複雜、併發上限低於 Apache後端應用伺服器、專注業務邏輯執行
場景推薦模式理由
傳統 Java EE (WAR 部署)、需會話保持/故障轉移/SSL 傳遞mod_jk (AJP)功能最全、生產驗證最久
Spring Boot / 微服務 / 內嵌容器、統一 HTTP API 網關mod_proxy_http無需 AJP、配置極簡、雲原生友好
新專案、團隊熟悉 Proxy 體系、未來可能遷移至 Nginx/Envoymod_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 自帶。

效能調優關鍵點

  1. Apache MPM 選擇:Event MPM (Apache 2.4+) > Worker > Prefork。Event 適用於高併發長連接。
  2. KeepAlive:Apache 啟用 KeepAlive On、MaxKeepAliveRequests 100、KeepAliveTimeout 5,減少握手開銷。
  3. 靜態資源快取:mod_expires、mod_headers 設定長期快取 (1 年)、ETag、Vary。
  4. 壓縮傳輸:mod_deflate / mod_gzip 壓縮 text/*、application/json、application/javascript。
  5. Tomcat 線程池:maxThreads 依 CPU 核心數 × 2-4 設定,監控 currentThreadsBusy 持續 > 80% 時擴容。
  6. JVM 參數:-Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+HeapDumpOnOutOfMemoryError。

總結

Apache + Tomcat 整合 = 靜動分離 + 專業分工。
傳統 WAR 選 mod_jk/AJP,現代微服務選 mod_proxy_http。
核心不在「怎麼連」,而在「怎麼監控、怎麼調優、怎麼故障隔離」。建立全鏈路指標 (Apache 存取日誌 → Tomcat 存取日誌 → JVM GC 日誌 → 業務 APM),才是架構師的核心價值。

Copyright © Windows教程網 All Rights Reserved