参考:http://blog.csdn.net/bluishglc/article/details/6867358#
所搭配环境为centos6.4
本文是采用的mod_jk的方式搭建的集群环境。
1.进入下载好的tomcat-connectors-1.2.32-src.tar.gz文件所在目录,执行解压操作:
tar -zxvf tomcat-connectors-1.2.32-src.tar.gz
2.进入解压出的文件夹下的native子目录:
cd tomcat-connectors-1.2.32-src/native
3.进行编译参数配置:
./buildconf.sh
./configure --with-apxs=/usr/local/apache2/bin/apxs --with-java-home=$JAVA_HOME --with-java-platform=2 --enable-jni
执行这步时,可能会提示未安装各种包如autoconf,按提示安装完后再执行就可以。
4.编译安装:
make
make install
如果成功结束,你可以在/usr/local/apache2/modules/下找到mod_jk.so文件。
1、下载tomcat,可以通过下面的命令下载:
#wget http://apache.mirror.phpchina.com/tomcat/tomcat-6/v6.0.18/bin/apache-tomcat-6.0.18.tar.gz
2、解压启动测试:
#tar -zxvf apache-tomcat-6.0.18.tar.gz
#./apache-tomcat-6.0.18/bin/startup.sh
在浏览器中输入:http://localhost:8080,看是否启动正常,若正常进行第三步。
3、下面通过一个简单的" Test.jsp "程序进一步验证 Tomcat 是否安装成功。在webapp目录下新建一个项目名称如test,在此目录下新建一个源文件。
新建名称为" Test.jsp "的 Jsp 源文件并在其中输入如下代码。
<%@ page contentType="text/html;charset=GBK"%>
<html>
<head>
<title> Tomcat_ _测试 </title>
</head>
<body>
<font color = "red" size = "" >
<% out.print( "_ _恭喜您,成功的安装并启动了 Tomcat " ); %>
</font>
</body>
</html>
4、重启(命令如下),然后输入:http://localhost:8080/test/Test.jsp 看是否正常。
#./apache-tomcat-6.0.18/bin/shutdown.sh
#./apache-tomcat-6.0.18/bin/startup.sh
安装tomcat成功后。
需要修改/conf/server.xml文件。
集群里有多个tomcat时,可先搭建一个tomcat,与apache关联配置没有问题了再安装多个tomcat。当然也可以直接安装多个tomcat直接进行配置。
1、安装两个或以上tomcat
#./apache-tomcat-6.0.18/bin/shutdown.sh
#mv apache-tomcat-6.0.18 /usr/local/TC6_A
#cd /usr/local
#cp -a TC6_A TC6_B
提示:进行上述步骤操作的原因是,本案例中集群的各个 Tomcat 服务器实例运行在同一个物理服务器上,因此集群中有几个 Tomcat 实例一般就需要几个 Tomcat 的安装。另外,由于集群中的各个 Tomcat 实例位于同一个物理服务器上的一个操作系统下,因此各个实例占用的各种网络端口不能相同,否则集群中的多个 Tomcat 实例不能同时正常启动,下面的步骤将介绍如何修改 Tomcat 实例需要使用的各个网络端口。
2、修改 Tomcat 实例需要使用的各个网络端口
1)找到 server.xml 配置文件中的" Server "配置项目,并进行修改。
<Server port="" shutdown="SHUTDOWN">
<Server port="" shutdown="SHUTDOWN">
说明:第一行为两个 Tomcat 修改前的情况,第二行为 TC6_A Tomcat 修改后的情况。如果多个tomcat里server的port端口值相同,则只能启动一个tomcat成功。
2)找到 server.xml 配置文件中的相应" Connector "配置项目,并进行修改。
<!-- Define an AJP 1.3 Connector on port -->
<Connector port = "" protocol = "AJP/1.3" redirectPort = "" />
TC6_A 中修改后内容如下:
<!-- Define an AJP 1.3 Connector on port -->
<Connector port = " " protocol = "AJP/1.3" redirectPort = " 10043 " />
提示:此步骤目的是修改 AJP Connector 端口。
注意:
port 的取值必须要于mod_jk中的workers.properties文件中设置的每个结点名称的port要相对应。
3)找到 server.xml 配置文件中的另一个相应" Connector "配置项目,并进行修改。
<Connector port = "" protocol = "HTTP/1.1" connectionTimeout = ""
redirectPort = "" />
TC6_A 中修改后内容如下:
<Connector port = "" protocol = "HTTP/1.1" connectionTimeout = ""
redirectPort = "" />
提示:此步骤目的是修改 HTTP Connector 端口,其中的" 10001 是未来通过浏览器访问集群中各个 Tomcat 实例的 HTTP 端口。
4)通过修改 Engine 配置选项,配置集群中每个 Tomcat 实例的名称。
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name = "Standalone" defaultHost = "localhost" jvmRoute = "jvm1">
<Engine name = "Catalina" defaultHost = "localhost">
-->
TC6_A 中修改后内容如下:
<Engine name = "Standalone" defaultHost = "localhost" jvmRoute = "Tomcat1">
提示:注意在修改过程中要注释掉原来 name 为 Catalina 的 Engine 配置项目,将 name 为 Standalone 的 Engine 配置项目的注释去掉并修改 jvmRoute 属性。
注意:
jvmRoute 的取值必须要于mod_jk中的workers.properties文件中设置的结点名称相一致。
因为:该值将做为后缀加在每一个由该结点生成的jsessionid后面,而mod_jk正是根据sessionid后面的这个后缀来确定一个请求应由哪一个结点来处理。(这是实现session_sticky的基本保证)
5)修改配置文件中的 Cluster 配置项目,对集群的各项参数进行设置。
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" />
TC6_A 中修改后内容如下:
<Cluster className = "org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions = "">
<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 = ""
frequency = ""
dropTime = ""/>
<Receiver className = "org.apache.catalina.tribes.transport.nio.NioReceiver"
address = "auto"
port = ""
autoBind = ""
selectorTimeout = ""
maxThreads = "" />
<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" />
</Channel>
<Valve className = "org.apache.catalina.ha.tcp.ReplicationValve" filter="" />
<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>
这份默认配置可以满足大多数应用场景,因此,我们只需要将这份配置复制到<Engine/>中,tomcat的配置就全部完成了。
注意:集群里,每个tomcat里port值要不相同。如tomcat1为4000,tomcat2要为4001
提示:上述配置内容主要是对集群中各个 Tomcat 实例间进行通信的方式、端口以及 Session 共享算法的设置。
3、多个tomcat里,直接将已设置好的server.xml文件拷贝到新的tomcat中将默认的配置文件替换,再按照上述步骤2,修改各个值。
共需要修改6个位置。
1、打开apache安装目录下的conf/httpd.conf文件,在文件最后追加以下内容:
# Load mod_jk module
LoadModule jk_module modules/mod_jk.so
# Specify jk log file.
JkLogFile /var/log/mod_jk.log
# Specify jk log level [debug/error/info]
JkLogLevel info
# Specify workers.properties, this file tell jk:
# how many nodes and where they are.
JkWorkersFile conf/workers.properties
# Specify which requests should handled by which node.
JkMount /* controller
关于mod_jk配置项的详细内容,可参考:http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html
2、根据步骤1的设置,JkWorkersFile conf/workers.properties 指明由一个workers.properties文件来描述集群结点的情况。
因此,我们需要创建这个workers.properties文件,并放置于conf文件夹下,这个文件的内容如下:
#所有节点列表,其中controller是一个逻辑结点,负责负载均衡控制,
#如果JkMount中的URL指定给了controller就表示这个请求会被自动散列到某个物理节点上。
#注意:真正负责处理请求的tomcat的名称(这里就是tomcat1,tomcat2)必须于它们在conf/server.xml
#文件中配置的jvmRout的属性值是一致的!
worker.list = controller,tomcat1,tomcat2
#========tomcat1========
worker.tomcat1.port= #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = #server的加权比重,值越高,分得的请求越多
#========tomcat2========
worker.tomcat2.port= #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat2.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = #server的加权比重,值越高,分得的请求越多
#========controller,负载均衡控制器========
worker.controller.type=lb
worker.controller.balance_workers=tomcat1,tomcat2 #指定分担请求的tomcat,旧版本中的balanced_workers,已不再推荐使用!
worker.controller.sticky_session= #sticky_session为1表示,
#当某一 client的session创建之后,后续由该客户端发起的请求,也就是这个session的所有请求都始终由第一次处理该请求的结点
#负责处理(除非该结点挂掉)
这里的配置文件为2个tomcat里的配置文件,如果是多个则可以类似修改。
若上述配置文件,启动时只有一个tomcat,则搭建的是相当于是apache与一个tomcat的集群。
到第五步结束后,所有配置均已完成,启动两个tomcat和apache后,将某一应用同时部署到两个tomcat中,通过apache访问这个应用,观察tomcat后台打出的日志会发现,请求被随机分配给了两个tomcat交替执行。
1、页面方式验证
重启apache+加一个tomcat。
测试:
1)http://ip:6080/test/test.jsp,查看是否显示正常,若正常说明tomcat1启动是正常的。
2)http://ip/test/test.jsp ,查看是否显示正常,若正常说明apache+tomcat1集群没有问题。
重启apache+加二台tomcat。
测试:
1)http://ip:6080/test/test.jsp,查看是否显示正常,若正常说明tomcat1启动是正常的。
2)http://ip:7080/test/test.jsp,查看是否显示正常,若正常说明tomcat2启动是正常的。
3)http://ip/test/test.jsp ,查看是否显示正常,若正常说明apache+2台tomcat集群设置成功。
为验证集群策略,可以将test.jsp页面将当前的tomcat实例名称打印出来。
客户端打开此页面时,查看页面是否会显示不同的tomcat实例名称。
2、可以直接查看apache与tomcat的日志,可看出集群是否生效。