Tomcat 集群的搭建

Tomcat 的安装后,就可以开始搭建 Tomcat 集群了,具体步骤如下:

( 1 )将系统根目录( / )下的“ apache-tomcat-6.0.14 ”的文件夹改名为“ TC6_A ”,如图 3-2-1 所示。
3-2-1

图 3-2-1

( 2 )在系统根目录( / )下新建一个文件夹,将其命名为“ TC6_B ”,如图 3-2-2 所示。
3-2-2

图 3-2-2

( 3 )将“ TC6_A ”文件夹下的所有文件目录拷贝到“ TC6_B ”文件夹下,如图 3-2-3 所示。
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

图 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

图 3-2-5

( 12 )再新开一个终端窗口,在其中键入如下两条命令,启动 TC6_B Tomcat 实例,如图 3-2-6 所示。

cd /TC6_B/bin

./startup.sh
3-2-6

图 3-2-6

提示:请读者特别注意,在启动多个 Tomcat 时,必须等一个 Tomcat 实例完全启动之后才可以启动另一个 Tomcat 实例。例如:必须先等 TC6_A 实例先启动以后才可以启动 TC6_B 实例,否则,将发生错误,导致两个 Tomcat 实例都无法正常启动。

( 13 )在浏览器地址栏输入“ http://localhost:10001 ” ,便进入如图 3-2-7 所示的 Tomcat 欢迎页面。
3-2-7

图 3-2-7

提示:上述页面是集群中 TC6_A Tomcat 实例的欢迎页面。

( 14 )再新开一个浏览器,在浏览器地址栏输入“ http://localhost:20001 ” ,便进入如图 3-2-8 所示的 Tomcat 欢迎页面。
3-2-8

图 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

图 3-2-9

( 18 )再新开一个浏览器,在浏览器地址栏输入“ http://localhost:20001/Hello.jsp ”,便进入如图 3-2-10 所示的页面。
3-2-10

图 3-2-10

如果能顺利地在浏览器中见到上述两个页面,则说明集群中的两个 Tomcat 实例工作完全正常。下面就可以为集群安装、设置 Apache 负载均衡器了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值