Apache HTTP Server 擅長處理靜態資源、SSL、負載平衡與安全防護;Tomcat (Servlet/JSP 容器) 擅長執行動態 Java 網頁邏輯。兩者結合可發揮各自優勢:Apache 處理靜態檔案與前端代理,Tomcat 專注業務邏輯運算。早期使用 mod_jserv 整合,但配置複雜、效能低、SSL 支援差。Jakarta 專案推出 mod_jk (AJP 1.3 協定) 解決這些問題,並支援多種 Web Server。
/usr/java1.2)/usr/local/bin)/usr/local/bin)apache_1.3.19.tar.gzjakarta-tomcat-3.2.1-src.tar.gz (需編譯 mod_jk)jakarta-tomcat-3.2.1.tar.gz# 解壓縮
gzip -dc ./apache_1.3.19.tar.gz | tar xf -
# 進入目錄配置
cd apache_1.3.19
./configure --prefix=/home/apache-1.3.19 --with-perl=/usr/local/bin/perl --enable-module=so
# 編譯安裝 (需 root 權限)
su
make install
# 解壓縮 Tomcat 原始碼
gzip -dc jakarta-tomcat-3.2.1-src.tar.gz | tar xf -
# 進入 mod_jk 原始碼目錄
cd jakarta-tomcat-3.2.1-src/src/native/apache1.3
# 使用 apxs 編譯 mod_jk.so
/home/apache-1.3.19/bin/apxs -o mod_jk.so -DSOLARIS -I../jk -I/usr/java1.2/include -I/usr/java1.2/include/solaris -lposix4 -c *.c ../jk/*.c
# 安裝模組
su
/home/apache-1.3.19/bin/apxs -i -a -n jk mod_jk.so
成功訊息範例:
cp mod_jk.so /home/apache-1.3.19/libexec/mod_jk.so
chmod 755 /home/apache-1.3.19/libexec/mod_jk.so
[activating module `jk' in /home/apache-1.3.19/conf/httpd.conf]
su
gzip -dc jakarta-tomcat-3.2.1.tar.gz | (cd /home; tar xf -)
# 載入模組 (apxs -a 已自動加入,若無請手動加入)
LoadModule jk_module libexec/mod_jk.so
# Worker 定義檔與日誌
JkWorkersFile /home/jakarta-tomcat-3.2.1/conf/workers.properties
JkLogFile /home/apache-1.3.19/logs/mod_jk.log
JkLogLevel warn
# 將 *.jsp 與 /servlet/* 請求轉發給 Tomcat (worker 名稱 ajp13)
JkMount /*.jsp ajp13
JkMount /servlet/* ajp13
<Connector className="org.apache.tomcat.service.PoolTcpConnector">
<Parameter name="handler" value="org.apache.tomcat.service.connector.Ajp13ConnectionHandler"/>
<Parameter name="port" value="8009"/>
</Connector>
<Context path="" docBase="/home/htdocs" debug="0">
</Context>
workers.tomcat_home=/home/jakarta-tomcat-3.2.1
workers.java_home=/usr/java1.2
ps=/
# 在 BASEDIR=`dirname $0` 之前加入
PATH=/usr/java1.2/bin:$PATH:.
JAVA_HOME=/usr/java1.2
TOMCAT_HOME=/home/jakarta-tomcat-3.2.1
export PATH JAVA_HOME TOMCAT_HOME
# 啟動 Apache
/home/apache-1.3.19/bin/apachectl start
# 啟動 Tomcat
/home/jakarta-tomcat-3.2.1/bin/startup.sh
# 建立測試 JSP
vi /home/apache-1.3.19/htdocs/test.jsp
<html><head><title>JSP Test</title></head>
<body><% out.print("This is a JSP test file!"); %></body></html>
瀏覽器訪問 https://主機名/test.jsp,若顯示測試文字即代表整合成功。
C:\jdk1.2.2)apache_1.3.19-win32-no_src-r2.msimod_jk.zipjakarta-tomcat-3.2.1.zipmod_jk.zip 到 Apache 的 modules 子目錄。jakarta-tomcat-3.2.1.zip 到 C:\ 目錄。# DSO 支援區段
LoadModule jk_module modules/mod_jk.dll
# 檔案尾部加入
JkWorkersFile C:/jakarta-tomcat-3.2.1/conf/workers.properties
JkLogFile C:/jakarta-tomcat-3.2.1/logs/mod_jk.log
JkLogLevel warn
JkMount /*.jsp ajp13
JkMount /servlet/* ajp13
參考 Unix 部分配置 server.xml、workers.properties,注意路徑分隔符改用反斜線 \。
set TOMCAT_HOME=C:\jakarta-tomcat-3.2.1
set JAVA_HOME=C:\jdk1.2.2
set PATH=C:\jdk1.2.2\bin;.;%PATH%
啟動 Apache (開始選單或 apachectl start) 與 Tomcat (startup.bat),瀏覽器訪問測試 JSP 驗證。
| 概念 | 說明 |
|---|---|
| AJP 1.3 | Apache JServ Protocol 1.3,專為 Web Server 與 Servlet 容器高效通訊設計的二進制協定 |
| mod_jk | Apache 模組,實作 AJP 1.3 客戶端,負責將動態請求轉發給 Tomcat |
| JkMount | URL 對應規則,決定哪些請求交給哪個 Worker 處理 |
| Worker | Tomcat 實例的邏輯代表,定義於 workers.properties |
| Context docBase | Tomcat 對應 Apache DocumentRoot 的實體路徑,確保 JSP 檔案可被兩邊存取 |
Apache + Tomcat (mod_jk) 架構是早期 Java Web 部署的經典模式,雖然現代多改用 Nginx + Tomcat 或直接使用 Tomcat 獨立模式 (配合 Nginx 反向代理),但理解 AJP 協定、Worker 概念、靜動態分離原理,對於微服務閘道設計、傳統系統遷移仍具高度參考價值。