Apache mod_jk是Apache HTTP Server连接Tomcat等Servlet容器的经典模块,它通过AJP协议把客户端请求转发给后端应用节点。在访问量增长、单台Tomcat扛不住压力时,用mod_jk把多台Tomcat组成负载均衡或集群,既能分散流量,也能避免单点故障。理解它的工作方式,是做好配置的前提。
一、mod_jk核心概念与工作原理
mod_jk本质是一个Apache的动态模块,编译或安装后由Apache加载。它不使用HTTP反向代理那种纯文本转发,而是采用二进制AJP13协议与Tomcat通信,效率比普通代理高,且能传递更多原始请求信息,比如客户端真实IP、SSL状态等。Tomcat端需要开启8009这样的AJP连接器,专门接收mod_jk发来的请求。
在负载均衡场景里,mod_jk维护一份worker列表,每个worker对应一个Tomcat实例或一组实例。请求到达Apache后,mod_jk根据配置好的负载规则,例如轮询、按权重分配,挑选一个worker转发。集群则更进一步,除了分担请求,还要求用户会话在节点间可用,通常配合Tomcat的DeltaManager做Session复制,或者依靠粘性会话让同一用户始终访问同一节点。
二、workers.properties配置详解
workers.properties是mod_jk最重要的文件,用来声明worker类型和节点地址。最基础的写法先定义负载均衡器worker,再定义具体Tomcat节点。例如设定worker.list为lb,然后给两个节点tomcat1、tomcat2配置host、port和type,最后把它们挂到lb下面,并指定balance_workers。
权重控制是实际运维常用手段。在节点配置中加上lbfactor,数值越大分到请求越多,适合后端机器性能不均的情况。下面给出一个简明对照表,说明常见配置项含义:
| 配置项 | 作用 | 示例 |
|---|---|---|
| worker.list | 声明可被Apache引用的worker名 | worker.list=lb |
| worker.xxx.type | 节点类型,ajp13或lb | worker.tomcat1.type=ajp13 |
| worker.xxx.host | Tomcat所在IP或域名 | worker.tomcat1.host=192.168.1.10 |
| worker.xxx.port | Tomcat AJP端口 | worker.tomcat1.port=8009 |
| worker.xxx.lbfactor | 负载权重 | worker.tomcat1.lbfactor=1 |
除了静态定义,还可以设置worker.xxx.socket_timeout等参数,控制连接超时和重试。如果某节点宕机,mod_jk会根据retries和recovery_time判定并暂时摘除,这对集群高可用很关键。配置时建议先只用一台Tomcat调通,再逐步加节点。
三、Apache端httpd.conf与粘性会话
在Apache主配置里,先通过LoadModule加载mod_jk模块,再用JkWorkersFile指向workers.properties,JkLogFile设置日志路径便于排查。JkMount用来把特定URL转发给某个worker,例如把/*发给lb实现全站均衡。若只代理jsp或servlet,可写JkMount /*.jsp lb。
粘性会话(Session Sticky)能减少Session复制压力。开启时mod_jk根据首次分配节点写入Cookie或改写URL,后续请求直送原节点。配置上在lb worker加sticky_session=1,同时Tomcat的Engine要配jvmRoute,且值须和workers.properties里的节点名一致。这样用户登录态不会因轮询跳转而丢失,是多数系统的稳妥选择。
四、Tomcat集群与会话复制
若要求节点宕机后用户不掉线,就必须做Session复制。Tomcat自带集群功能,在server.xml的Cluster标签启用DeltaManager,组播或静态成员列表同步Session。每个节点需有唯一Receiver端口,且web.xml里加distributable标记,告诉容器本应用支持分布式子会话。
实际落地时,粘性会话加轻量复制是常见组合:平时请求固定到节点,后台异步复制Session,一旦节点失效,其他节点已有所需数据,用户无感知切换。要注意网络延迟和复制量,过大Session会拖慢集群。建议把对象缩小,或用Redis外置会话,减轻Tomcat间广播负担。
五、排错与性能建议
配置完常遇问题包括AJP端口不通、mod_jk版本与Apache不匹配、jvmRoute写错导致粘性失效。看JkLogFile里ERROR级别信息最直观,比如连不上host会报连接拒绝。防火墙要放行8009及集群组播端口,云服务器还需检查安全组。
性能方面,Apache的线程数、Tomcat最大连接都应按压测调整。mod_jk的cache大小、connect_timeout也可优化。访问淘宝官网(www.taobao.com)这类大站虽不用mod_jk,但思路类似:接入层做分发,应用层无状态化最易扩展。中小项目用mod_jk够简单可靠,理清上面各环节就能搭出稳的负载均衡与集群。
Apache_mod_jk负载均衡集群配置修改时间:2026-08-11 19:57:35