在 Linux 环境下,Apache 配合 JK (mod_jk) 是一种经典的架构,主要用于将 Apache 作为前端 Web 服务器(处理静态资源、SSL 终止等),并将动态请求转发给后端的 Tomcat 或 Jetty 等应用服务器。
mod_jk 是 Apache 的一个模块,它使用 AJP (Apache JServ Protocol) 协议与后端应用服务器通信。
以下是完整的配置指南,涵盖安装、配置和常见问题。
架构简述
[ 客户端 ] --> [ Apache (mod_jk) :80/443 ] --> [ AJP 协议 ] --> [ Tomcat :8009 ]
- Apache: 负责静态文件(HTML/CSS/JS/图片)、SSL 加密、负载均衡。
- mod_jk: Apache 的连接器模块。
- Tomcat: 运行 Java Web 应用,监听 AJP 端口(默认 8009)。
安装步骤
1 安装 Apache 和 mod_jk
Ubuntu/Debian:
sudo apt update sudo apt install apache2 libapache2-mod-jk
CentOS/RHEL:
sudo yum install httpd mod_jk # 或者在较新版本中使用 dnf sudo dnf install httpd mod_jk
2 安装 Tomcat
确保 Tomcat 已安装并正在运行,默认情况下,Tomcat 的 AJP 连接器在 server.xml 中是启用的,监听端口为 8009。
配置 Tomcat
确保 Tomcat 的 server.xml 中启用了 AJP 连接器:
<!-- 在 server.xml 的 <Service> 标签内 --> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
注意:如果修改了 Tomcat 配置,请重启 Tomcat。
配置 mod_jk
mod_jk 的主要配置文件通常位于 /etc/libapache2-mod-jk/ 或 /etc/httpd/conf/ 目录下。
1 创建 workers.properties
定义后端 Tomcat 服务器列表。
文件路径: /etc/libapache2-mod-jk/workers.properties
# 定义 worker 名称 worker.list=worker1 # 定义 worker1 的类型为 ajp13 worker.worker1.type=ajp13 # 指定 Tomcat 主机地址(本地则为 localhost) worker.worker1.host=localhost # 指定 Tomcat 的 AJP 端口(默认 8009) worker.worker1.port=8009 # 设置负载因子(用于负载均衡,单节点可忽略) worker.worker1.lbfactor=1
2 配置 Apache 加载 mod_jk
文件路径: /etc/apache2/mods-available/jk.conf (Ubuntu) 或 /etc/httpd/conf.d/jk.conf (CentOS)
# 加载 mod_jk 模块 LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so # 或者在 CentOS 上可能是: LoadModule jk_module modules/mod_jk.so # 指定 workers.properties 文件路径 JkWorkersFile /etc/libapache2-mod-jk/workers.properties # 指定 JK 日志文件路径 JkLogFile /var/log/apache2/mod_jk.log # 设置日志级别 (info, debug, error, trace) JkLogLevel info # 指定哪些请求需要转发给 Tomcat # 所有以 .jsp, .do, .action 结尾的请求 JkMount /.jsp worker1 JkMount /.do worker1 JkMount /.action worker1 # 或者:将所有请求都转发(不推荐,静态文件会由 Tomcat 处理,效率低) # JkMount / worker1
提示:在 Ubuntu 上,你可能需要启用该模块:
sudo a2enmod jk
3 配置虚拟主机(可选但推荐)
为了更精细地控制,建议在虚拟主机配置中指定 JkMount。
文件路径: /etc/apache2/sites-available/000-default.conf 或自定义 vhost 文件
<VirtualHost :80>
ServerName www.example.com
DocumentRoot /var/www/html
# 静态文件由 Apache 直接处理
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# 动态请求转发给 Tomcat
JkMount /app/ worker1
JkMount /app/.jsp worker1
# 日志
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
重启服务
# 重启 Apache sudo systemctl restart apache2 # 或 sudo systemctl restart httpd # 检查 Tomcat 是否运行 sudo systemctl status tomcat
验证配置
- 访问 Apache 的静态页面,确认能正常显示。
- 访问动态页面(如
/app/test.jsp),确认能由 Tomcat 处理并返回结果。 - 查看日志:
tail -f /var/log/apache2/mod_jk.log
常见问题与排查
Q1: 502 Bad Gateway 或 Connection Refused
- 原因:Tomcat 未启动,或 AJP 端口(8009)未监听。
- 解决:检查 Tomcat 状态,确认
server.xml中 AJP 连接器已启用。
Q2: 静态文件访问慢
- 原因:如果配置了
JkMount / worker1,所有请求都会转发给 Tomcat,包括 CSS/JS/图片。 - 解决:只将动态请求(如
.jsp,.do,/api/)转发给 Tomcat,静态文件由 Apache 直接提供。
Q3: mod_jk 已弃用?
- 现状:
mod_jk确实已停止维护多年,Apache 官方推荐使用 mod_proxy_ajp 或 mod_proxy_http。 - 替代方案:
- mod_proxy_ajp: 配置更简单,无需
workers.properties。LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so ProxyPass /app ajp://localhost:8009/app ProxyPassReverse /app ajp://localhost:8009/app
- mod_proxy_http: Tomcat 配置了 HTTP 连接器(默认 8080),可以使用 HTTP 协议转发。
ProxyPass /app http://localhost:8080/app ProxyPassReverse /app http://localhost:8080/app
- mod_proxy_ajp: 配置更简单,无需
建议:如果是新项目,推荐使用
mod_proxy_ajp或mod_proxy_http,它们更轻量且维护更好。mod_jk仅建议在遗留系统中使用。
| 特性 | mod_jk | mod_proxy_ajp |
|---|---|---|
| 协议 | AJP 1.3 | AJP 1.3 |
| 配置文件 | 需要 workers.properties |
直接在 Apache 配置中指定 |
| 维护状态 | 已停止维护 | 活跃维护 |
| 性能 | 良好 | 良好 |
| 推荐度 | 仅用于遗留系统 | 新项目推荐 |
如果你正在搭建新系统,建议直接使用 mod_proxy_ajp 或 mod_proxy_http,如果必须使用 mod_jk,请确保正确配置 workers.properties 和 JkMount。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/478317.html



