Tomcat 的安装后,就可以开始搭建 Tomcat 集群了,具体步骤如下:
( 1 )将系统根目录( / )下的“ apache-tomcat-6.0.14 ”的文件夹改名为“ TC6_A ”,如图 3-2-1 所示。
图 3-2-1
( 2 )在系统根目录( / )下新建一个文件夹,将其命名为“ TC6_B ”,如图 3-2-2 所示。
图 3-2-2
( 3 )将“ TC6_A ”文件夹下的所有文件目录拷贝到“ TC6_B ”文件夹下,如图 3-2-3 所示。
图 3-2-3
提示:进行上述步骤操作的原因是,本案例中集群的各个 Tomcat 服务器实例运行在同一个物理服务器上,因此集群中有几个 Tomcat 实例一般就需要几个 Tomcat 的安装。另外,由于集群中的各个 Tomcat 实例位于同一个物理服务器上的一个操作系统下,因此各个实例占用的各种网络端口不能相同,否则集群中的多个 Tomcat 实例不能同时正常启动,下面的步骤将介绍如何修改 Tomcat 实例需要使用的各个网络端口。
( 4 )打开“ TC6_A ”文件夹下“ conf ”文件夹下的“ server.xml ”文件以及“ TC6_B ”文件夹下“ conf ”文件夹下的“ server.xml ”文件,如图 3-2-4 所示。
图 3-2-4
提示:由于对各种网络端口及集群的配置内容都在 server.xml 文件中,因此想正确配置集群就需要修改各个 Tomcat 的 server.xml 配置文件。
( 5 )找到 server.xml 配置文件中的“ Server ”配置项目,并进行修改。
<Server port="8005" shutdown="SHUTDOWN">
<Server port="10005" shutdown="SHUTDOWN">
<Server port="20005" shutdown="SHUTDOWN">
说明:第一行为两个 Tomcat 修改前的情况,第二行为 TC6_A Tomcat 修改后的情况,第三行为 TC6_B Tomcat 修改后的情况。
( 6 )找到 server.xml 配置文件中的相应“ Connector ”配置项目,并进行修改。
- 修改前内容如下:
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port = "8009" protocol = "AJP/1.3" redirectPort = "8443" />
q TC6_A 中修改后内容如下:
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port = " 10009 " protocol = "AJP/1.3" redirectPort = " 10043 " />
- TC6_B 中修改后内容如下:
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port = " 20009 " protocol = "AJP/1.3" redirectPort = " 10043 " />
提示:此步骤目的是修改 AJP Connector 端口。
( 7 )找到 server.xml 配置文件中的另一个相应“ Connector ”配置项目,并进行修改。
- 修改前内容如下:
<Connector port = "8080" protocol = "HTTP/1.1"
connectionTimeout = "20000"
redirectPort = "8443" />
- TC6_A 中修改后内容如下:
<Connector port = " 10001 " protocol = "HTTP/1.1"
connectionTimeout = "20000"
redirectPort = " 10043 " />
- TC6_B 中修改后内容如下:
<Connector port = " 20001 " protocol = "HTTP/1.1"
connectionTimeout = "20000"
redirectPort = " 20043 " />
提示:此步骤目的是修改 HTTP Connector 端口,其中的“ 10001 ”与“ 20001 ”是未来通过浏览器访问集群中各个 Tomcat 实例的 HTTP 端口。
( 8 )通过修改 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 ">
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name = "Catalina" defaultHost = "localhost">
-->
- TC6_B 中修改后内容如下:
<Engine name = "Standalone" defaultHost = "localhost" jvmRoute = " Tomcat2 ">
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name = "Catalina" defaultHost = "localhost">
-->
提示:请读者注意在修改过程中要注释掉原来 name 为 Catalina 的 Engine 配置项目,将 name 为 Standalone 的 Engine 配置项目的注释去掉并修改 jvmRoute 属性。
( 9 )修改配置文件中的 Cluster 配置项目,对集群的各项参数进行设置。
- 修改前内容如下:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" />
- TC6_A 中修改后内容如下:
<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 = "4000"
autoBind = "100"
selectorTimeout = "5000"
maxThreads = "6" />
<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>
- TC6_B 中修改后内容如下:
<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 = "4000"
autoBind = "100"
selectorTimeout = "5000"
maxThreads = "6" />
<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>
提示:上述配置内容主要是对集群中各个 Tomcat 实例间进行通信的方式、端口以及 Session 共享算法的设置。本教程由于篇幅所限,不能一一详细介绍,有兴趣的读者可以参看 Tomcat 的官方文档,其中有非常详细的说明。
( 10 )这样我们就完成了对 Tomcat 集群的设置,下面就可以同时启动这两个 Tomcat 实例了。
( 11 )在终端键入如下两条命令,启动 TC6_A Tomcat 实例,如图 3-2-5 所示。
cd /TC6_A/bin
./startup.sh
图 3-2-5
( 12 )再新开一个终端窗口,在其中键入如下两条命令,启动 TC6_B Tomcat 实例,如图 3-2-6 所示。
cd /TC6_B/bin
./startup.sh
图 3-2-6
提示:请读者特别注意,在启动多个 Tomcat 时,必须等一个 Tomcat 实例完全启动之后才可以启动另一个 Tomcat 实例。例如:必须先等 TC6_A 实例先启动以后才可以启动 TC6_B 实例,否则,将发生错误,导致两个 Tomcat 实例都无法正常启动。
( 13 )在浏览器地址栏输入“ http://localhost:10001 ” ,便进入如图 3-2-7 所示的 Tomcat 欢迎页面。
图 3-2-7
提示:上述页面是集群中 TC6_A Tomcat 实例的欢迎页面。
( 14 )再新开一个浏览器,在浏览器地址栏输入“ http://localhost:20001 ” ,便进入如图 3-2-8 所示的 Tomcat 欢迎页面。
图 3-2-8
提示:上述页面是集群中 TC6_B Tomcat 实例的欢迎页面。如果能顺利看到上述两个步骤的 Tomcat 欢迎页面,则说明 Tomcat 集群配置基本成功。下面将通过一个十分简单的 JSP 来进一步测试对“ TC6_A ”和“ TC6_B ”的设置是否成功。
( 15 )在“ TC6_A ”文件夹下“ webapps ”文件夹下“ ROOT ”文件夹中新建名称为“ Hello.jsp ”的 Jsp 源文件,并向其中添加如下代码:
<%@ page contentType="text/html;charset=GBK"%>
<html>
<head>
<title>Tomcat 测试 </title>
</head>
<body>
<font color="red" size="20">
<!— 使用 out 内建对象打印一条消息到输出页面 -->
<% out.print( “Tomcat 集群测试 A !!! ” ); %>
</font>
</body>
</html>
( 16 )在“ TC6_B ”文件夹下“ webapps ”文件夹下“ ROOT ”文件夹中新建名称为“ Hello.jsp ”的 Jsp 源文件,并向其中添加如下代码:
<%@ page contentType="text/html;charset=GBK"%>
<html>
<head>
<title>Tomcat 测试 </title>
</head>
<body>
<font color="red" size="20">
<!-- 使用 out 内建对象打印一条消息到输出页面 -->
<% out.print( “Tomcat 集群测试 B !!! ” ); %>
</font>
</body>
</html>
提示:上述两个步骤实际上是在集群中的不同 Tomcat 实例中部署了相同的 Web 应用。这样,在未来为集群设置了负载均衡器后,集群中任何一个实例都可以对外提供完全相同的服务,这在后面的部分会详细介绍。当然细心的读者会发现这两个 Hello.jsp 并不完全相同,这是为了在测试的时候提供方便,可以非常容易地知道访问了集群中那个实例的服务,实际开发中不必如此。
( 17 )在浏览器地址栏输入“ http://localhost:10001/Hello.jsp ”,便进入如图 3-2-9 所示的页面。
图 3-2-9
( 18 )再新开一个浏览器,在浏览器地址栏输入“ http://localhost:20001/Hello.jsp ”,便进入如图 3-2-10 所示的页面。
图 3-2-10
如果能顺利地在浏览器中见到上述两个页面,则说明集群中的两个 Tomcat 实例工作完全正常。下面就可以为集群安装、设置 Apache 负载均衡器了。