Apache + Tomcat 实现简单集群
Apache2.2 Tomcat6 集群服务器配置
引言
既然 Tomcat 本身已经可以提供这样的服务,我们为什么还要引入 Apache 或者其他的一些专门的 HTTP 服务器呢?原因有下面几个:
1. 提升对静态文件的处理性能
2. 利用 Web 服务器来做负载均衡以及容错
3. 无缝的升级应用程序
这三点对一个 web 网站来说是非常之重要的,我们希望我们的网站不仅是速度快,而且要稳定,不能因为某个 Tomcat 宕机或者是升级程序导致用户访问不了,而能完成这几个功能的、最好的 HTTP 服务器也就只有 apache 的 http server 了,它跟 tomcat 的结合是最紧密和可靠的。
JK方式:
A、准备工作
Apache:httpd-2.2.19-win32-x86-no_ssl.msi
Tomcat:apache-tomcat-6.0.32 复制成tomcat1,tomcat2.(还可以更多)
Mod_jk:mod_jk-1.2.31-httpd-2.2.3.so
下载地址:http://mirror.bjtu.edu.cn/apache/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.31/
mod_jk-1.2.31-httpd-2.2.3.so is for Apache 2.2.x. It has been build against version 2.2.3, but should work with Apache 2.2.0 and later. Rename to mod_jk.so before putting it in your Apache2.2/modules directory or adjust your LoadModule statement.(把mod_jk-1.2.31-httpd-2.2.3.so 改名成mod_jk.so 并放到Apache2.2/modules)不改名也行,实际运用的时候加载具体的名字。
B、配置httpd.conf。
httpd.conf :Apache 服务器的配置文件,用来加载 JK 模块以及指定 JK 配置文件信息。
打开apache中的httpd.conf配置文件 添加Include conf/mod_jk.conf 这句。
C、在apache conf目录中新建mod_jk.conf文件。
配置如下:
#加载mod_jk Module(用于Apache和tomcat通信的桥梁)
LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so
#指定 workers.properties文件路径(配置负载均衡用,下详)
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
#配置路径跳转,指将那些请求发给tomcat
JkMount /*.jsp controller
JkMount /*.action controller
JkMount /*.* controller
JkMount /* controller #这个很有必要,否则一些servlet的请求则无法转发给tomcat(例如jfreechart中的显示图片的/DisplayChart)
D、在apache conf目录中新建workers.properties.
这个文件是Tomcat 服务器的连接定义文件。这个文件可以自己在conf目录下新建,也可以在tomcat-connectors-1.2.31-src中找一个来修改。(#表示注解,配置了一台机器上的两个工作端口)
配置如下:
workers.tomcat_home=D:\server\tomcat1,D:\server\tomcat2
workers.java_home=D:\Java\jdk1.6.0_24
worker.list = controller,tomcat1,tomcat2 #server 列表
#========tomcat1========
worker.tomcat1.port=8009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
#========tomcat2========
worker.tomcat2.port=8019 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat2.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
#========controller,负载均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2 #指定分担请求的tomcat
worker.controller.sticky_session=1
worker.loadbalancer.sticky_session=true #session是否具有黏贴性(复制性)
E、修改集群中tomcat的sever.xml文件。
实验中的集群tomcat是apache-tomcat-6.0.32版本的tomcat1和tomcat2.因为是在同一台电脑上部署多个tomcat,所以需要修改一些端口号。
(1)<Server port="8005" shutdown="SHUTDOWN">
Tomcat1:8005 ,Tomcat2:8015.
(2)<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="60000"
redirectPort="8443" />
Tomcat1:8080、8443 ,Tomcat2:8081、8444.
(3)打开这段注释:<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
Tomcat1:tomcat1 ,Tomcat2:tomcat2。
(4)打开这段注释:<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
Tomcat1:8009、8443 ,Tomcat2:8019、8444。
(注意,上述修改需要跟workers.properties中的信息一致)
(4)在<Engine></Engine>中添加下面一段(可以在tomcat /docs/cluster-howto.html中找到):
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="6">
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
<!--
<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="5001"
selectorTimeout="100"
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"/>
<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;"/>
<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.ClusterSessionListener"/>
</Cluster>
Tomcat1:5001 ,Tomcat2:5002。
(5)<Host name="localhost" appBase="D:/server/myApp"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
根据自己喜好,把apache和tomact1、tomcat2部署的项目放到指定的位置。也可以在tomcat1和tomcat2中建立自己的虚拟目录。
(6)修改apache httpd.conf中的DocumentRoot为DocumentRoot "D:/server/myApp"。
F、建立D:/server/myApp目录。并把tomcat中拷贝host-manager和manager目录文件到该目录下。然后拷贝测试项目 index.jsp,或者需要部署的项目到这目录下。例如hzsmpt和shop这两个项目
H、启动tomcat1、tomcat2和apache。进行测试。
当你在tomcat控制台上看到这样的信息的时候,说明两个tomcat已经集成了。
然后输入:http://127.0.0.1/shop和http://127.0.0.1:8080/shop 以及http://127.0.0.1:8081/shop 的结果都是一样的。
按照上述方法,可以配置tomcat3.tomcat4等