1、 环境
Apache 2.2.15
Tomcat 6.0.20
Jdk 1.6
2、 软件
代理模块 mod_jk-1.2.28-httpd-2.2.X.so 下载地址:
将下载的 mod_jk-1.2.28-httpd-2.2.X.so 文件复制到 %apache_home% 安装目录 modules 目录下
3、 测试 tomcat
http://IP:8080/ ( tomcat1 所在服务器)
http://IP:8080/ ( tomcat2 所在服务器)
如下图表示正常
4、 配置 apache 服务器
a、 在 %apache_home% 目录下的 conf/httpd.conf 文件末尾中添加:
include conf/mod_jk.conf
b、 在 conf 目录中新建 mod_jk.conf 文件,内容如下:
# 加载 mod_jk Module
LoadModule jk_module modules/mod_jk-1.2.28-httpd-2.2.X.so
JkWorkersFile conf/workers.properties
指定 workers.properties 文件路径
JkLogFile logs/mod_jk.log
JkLogLevel info
JkMount /* controller
指定那些请求交给 tomcat 处理 ,"controller" 为在 workers.propertise 里指定的负载均衡器
c、 在 conf 目录下新建 workers.properties 文件,内容如下:
worker.list=controller,tomcat1,tomcat2
负载均衡器列表
worker.controller.type=lb
负载均衡器类型
worker.controller.balance_workers=tomcat1,tomcat2
指定分担请求的 tomcat 实例名
worker.controller.sticky_session=true
是否使用粘性会话,表示从同一窗口发来的请求都将有集群中的同一个 tomcat 进行处理
#========tomcat1========
worker.tomcat1.host=10.10.14.89
tomcat 的主机地址,如不为本机,请填写 ip 地址
worker.tomcat1.port=10009
ajp13 端口号,在 tomcat 下 server.xml 配置 , 默认 10009
worker.tomcat1.type=ajp13
实例节点类型
worker.tomcat1.lbfactor=1
worker 的加权比重,值越高,分得的请求越多
#========tomcat2========
worker.tomcat2.host=10.10.14.137
worker.tomcat2.port=20009
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
5、 修改 tomcat 配置文件
% tomcat_home%/conf/server.xml 的如下内容
a、 Engine 配置
修改前:
<Engine name = "Catalina" defaultHost = "localhost" >
修改后:
<Engine name = "Catalina" defaultHost = "localhost" jvmRoute = "tomcat1" >
<Engine name = "Catalina" defaultHost = "localhost" jvmRoute = "tomcat2" >
具体 tomcat 中 jvmRoute 的值根据在 workers.properties 的配置,注意 IP 地址、 tomcat 实例名称和 jvmRoute 值必须一一对应。
b、 Connector 配置
修改前:
<Connector port = "8009" protocol = "AJP/1.3" redirectPort = "8443" />
修改后:
<Connector port = "9009" protocol = "AJP/1.3" redirectPort = "8443" />
这里 tomcat 的 port 值必须与在 workers.properties 中的 port 值一致。
c、 Cluster 配置
<Cluster className = "org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions = "8" >
<Manager className = "org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown = "false"
notifyListenersOnReplication = "true" />
<Channel className = "org.apache.catalina.tribes.group.GroupChannel" >
<Membership className = "org.apache.catalina.tribes.membership.McastService" address = "228.0.0.4" port = "45564" frequency = "500" dropTime = "3000" />
<Receiver className = "org.apache.catalina.tribes.transport.nio.NioReceiver" address = "auto" port = "4001" autoBind = "100" selectorTimeout = "5000" maxThreads = "6" />
<!-- timeout="60000"-->
<Sender className = "org.apache.catalina.tribes.transport.ReplicationTransmitter" >
<Transport className = "org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
</Sender>
<Interceptor className = "org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />
<Interceptor className = "org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor" />
<Interceptor className = "org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor" />
</Channel>
<Valve className = "org.apache.catalina.ha.tcp.ReplicationValve"
filter = ".*/.gif;.*/.js;.*/.jpg;.*/.png;.*/.htm;.*/.html;.*/.css;.*/.txt;" />
<Valve className = "org.apache.catalina.ha.session.JvmRouteBinderValve" />
<Deployer className = "org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir = "/tmp/war-temp/" deployDir = "/tmp/war-deploy/" watchDir = "/tmp/war-listen/" watchEnabled = "false" / >
<ClusterListener className = "org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener" />
<ClusterListener className = "org.apache.catalina.ha.session.ClusterSessionListener" />
</Cluster>
6、 配置应用程序 web.xml
<web-appxmlns="http://java.sun.com/xml/ns/j2ee "xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance "xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd "version="2.4">
<display-name>TestDemo</display-name>
<distributable />
</web-app>
此配置说明当前 Web 工程处于分布式部署环境。如果不进行这个配置,每次访问页面 tomcat 都会产生一个新的 sessionid
7、 可能出现的问题
a、 Java 未先安装,或未正确配置 JAVA_HOME 体统环境变量;
b、 Linux 系统的防火墙 指定的 Tomcat 端口未被设置为远程可访问;