生產環境常需 Apache 靜態分發 + Tomcat 動態處理,並統一對外 80 端口。本文記錄 CentOS + Apache 2.2 + Tomcat 7 環境下,基於 mod_jk (AJP 協議) 的整合全流程。
用戶瀏覽器 :80
↓
Apache HTTP Server (靜態資源、PHP、反向代理)
↓ AJP 1.3 (port 8009)
Tomcat Servlet 容器 (Java 應用)
# 下載對應版本(CentOS 32位、Apache 2.2)
wget https://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/linux/jk-1.2.48/httpd-2.2.x/mod_jk.so
cp mod_jk.so /etc/httpd/modules/
mod_jk.conf(載入模塊、定義工作器、日誌)
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
# 將 /servlet/* 和 /MyProject/* 轉發給 Tomcat
JkMount /servlet/* ajp13
JkMount /MyProject/* ajp13
JkMount /MyProject ajp13
workers.properties(定義 Tomcat 連接點)
worker.list=ajp13
worker.ajp13.type=ajp13
worker.ajp13.host=localhost
worker.ajp13.port=8009
worker.ajp13.lbfactor=1
httpd.conf 關鍵修改
Listen 192.168.1.100:80 # 綁定具體 IP,避免 0.0.0.0 衝突
ServerName www.example.com:80
Include conf/mod_jk.conf # 載入上述配置
# 虛擬主機示例(可選)
<VirtualHost *:80>
ServerName www.example.com
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
# 關鍵:路徑必須與 Tomcat webapp 名稱一致
ProxyPass /MyProject https://www.example.com/MyProject/pages/login.jsp
ProxyPassReverse /MyProject https://www.example.com/MyProject/pages/login.jsp
</VirtualHost>
server.xml 確保 AJP 連接器啟用:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Connector port="9090" protocol="HTTP/1.1" ... /> <!-- 可選:保留 HTTP 直連端口供調試 -->
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<!-- 若需域名直接訪問,可配置 Context -->
</Host>
ROOT.xml(可選:將應用部署為根路徑)
<?xml version='1.0' encoding='utf-8'?>
<Context displayName="Welcome to Tomcat" docBase="" path="" debug="0"></Context>
https://www.example.com/MyProject/ 正常訪問 Java 應用(注意尾部 /)https://www.example.com/phpinfo.php 正常解析 PHPhttps://www.example.com/static/style.css Apache 直接服務靜態文件mod_jk 連接錯誤| 現象 | 原因 | 解決 |
|---|---|---|
| 404 Not Found | JkMount 路徑與 webapp 名不一致 | 確保 /MyProject/* 大小寫、前綴完全匹配 |
| 500 Internal Server Error | mod_jk 連不上 Tomcat 8009 | 檢查防火牆、Tomcat AJP Connector 是否啟用、端口占用 |
| 靜態資源 404 | Apache DocumentRoot 未包含靜態文件 | 配置 Alias /static /var/www/static 或調整 DocumentRoot |
| Session 不共享 | Apache PHP 與 Tomcat Java 獨立 Session | 引入 Redis/Memcached 共享 Session,或 Sticky Session |