刚好公司要用,网上看了很多感觉写的都不全,自己查资料,研究几天,终于弄出来,给大家分享下!希望帮助到更多的人!
需要软件
- apache_2.0.55-win32-x86-no_ssl.msi
- apache-tomcat-7.0.52
- mod_jk-apache-2.0.55.so
搭建流程
- 取出下载的mod_jk-apache-2.0.55.so,放到\Apache2\modules\目录下。
- 打开httpd.conf, 在末尾加上:
include “C:\Program Files (x86)\Apache Group\Apache2\conf\mod_jk.conf”,即调用conf目录下的mod_jk.conf这个配置文件。当然,apache conf目录下原来是没有这个文
件的。我们需要自己新建这个文件。 - 在conf目录下新建Mod_jk.conf内容如下:
#加载mod_jk Module
LoadModule jk_module modules/mod_jk-apache-2.0.55.so
#指定 workers.properties文件路径
JkWorkersFile conf/workers.properties
#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器
JkMount /*.jsp controller
- 接着我们在conf目录下新建workers.properties内容如下:
worker.list = controller #server 列表
#========tomcat1========
worker.tomcat1.port=8009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=2 #server的加权比重,值越高,分得的请求越多
#worker.tomcat1.redirect = tomcat2
#========tomcat2========
worker.tomcat2.port=18009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat2.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1 #server的加权比重,值越高,分得的请求越多
#worker.tomcat2.redirect = tomcat1
#========controller,负载均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2 #指定分担请求的tomcat
worker.controller.sticky_session=1
Tomcat集群配置
将2个tomcat分别解压后,分别打开apache-tomcat-7.0.52 \conf\server.xml文件。
(1) 修改端口:
2个tomcat, 为了避免端口冲突,其中一个端口使用默认的,而另一个得修改。必须修改的端口如
下:
以上3个地方都在前面加上一个“1”.就可以避免2个tomcat端口冲突。(注:这是tomcat6需要修
改的端口。其他版本的tomcat可能不止要修改这些端口。总之冲突的端口均需要修改)
(2) 修改集群设置:
在<Engine>或<Host>元素下添加以下内容均可。
方便拷贝,我把配置贴出来:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
<!--For clustering, please take a look at documentation at:
/docs/cluster-howto.html (simple how to)
/docs/config/cluster.html (reference documentation) -->
<!--
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-->
<!-- Use the LockOutRealm to prevent attempts to guess user passwords
via a brute-force attack -->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<!-- This Realm uses the UserDatabase configured in the global JNDI
resources under the key "UserDatabase". Any edits
that are performed against this UserDatabase are immediately
available for use by the Realm. -->
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b"/>
</Host>
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService" address="224.0.0.1" port="45564" frequency="500" dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4002" 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>
</Engine>
另外,按照官方文档里说明的的默认配置, 元素下的address属性默认值为228.0.0.4 . 这个配置在我的系统上始终会出现2个tomcat无法交换数据包的问题。需改成224.0.0.1才能正常使用。重要!!!
需要而外注意的是,2个tomcat里添加到上面这段配置,其下的Port元
素必需配置成不同的。如其中一个是4001,一个是4002.(tomcat默认可以检测到4000~4100之
间的端口)。
(3)修改的属性。
2个tomcat, jvmRoute分别配置成tomcat1和tomcat2,即和apache/conf里
worker.properites配置文件中配置的worker名称对应。
- 你要部署的项目集群配置:
(1)修改项目中的WEB-INF/web.xml文件,加入如下行:
所有需要集群的web项目,其web.xml中都必须添加
这个定义
(2) 将tlcom分别部署到2个tomcat中:
这里因为我沿用原来在tomcat上的开发方式,并不直接把项目放到tomcat/webapp目录下
(3) 分别启动两个tomcat
可以在tomcat\bin目录下执行
来启动,也可以通过在eclipse中先将server配置好(配置对应的2个tomcat server),在
eclipse中启动。
启动tomcat1:
和正常eclipse中启动一样,加载插件:
RONE初始化:
成功启动:
启动tomcat2:
启动过程和tomcat1一样,值得注意的是,在tomcat2启动的时候,tomcat1会打印出集群中加入
member的提示:
(4) 启动apache.通过IP访问apache. 比如我的是 http://10.188.182.43 (这里80端
口写不写是一样的)。
你会发现可能RONE都登陆不了,或者登陆了页面都无法正常打开。原因在于我们一开始配置的
Mod_jk.conf文件。文件末尾的请求转发。我们只转发了jsp页面的请求,就是说apache只会把
jsp页面的请求转发到2个tomcat上去。因此我们需要修改过滤的规则。我没有找到资料具体的各
种规则应该怎么写,只能写一个大的过滤:
JkMount /* controller
JkMount /*.do controller
将mod_jk.conf末尾改成上面这样。重启apache,你就可以看到RONE登陆界面了
到此完成!谢谢大家!