实现效果:用apache 分发要求到tomcat中的对应的项目
环境解释:
操作系统:window 通用
Javasdk: 1.7
Apache + Tomcat + mod_jk实现集群做事
Apache: 2.2.14 (本地安装路径:D:\Apache2.2\)
Tomcat: 7.0.42 ( http://tomcat.apache.org/download-70.cgi ),如果在同一台机器上仿照,下载zip版本. 实例中展示了2个节点
mod_jk: 1.2.37: ( http://tomcat.apache.org/download-connectors.cgi )
安装步骤:
1.安装jdk
2.安装Apache2.2,利用默认设置,并且安装路径中不要空格.
3.解压tomcat
4.拷贝mod_jk.so到Apache安装路径的modules文件夹下
配置步骤
修正Apache配置:
关于修正涉及到的文件httpd.conf和workers.properties文件可以下载一份mod_jk的源码包参看
1.修正Apache配置文件httpd.conf(笔者路径:D:\Apache2.2\conf\httpd.conf), 在末了一行末端添加:
include \公众D:\Apache2.2\conf\mod_jk.conf\公众
2. 在httpd.conf 同目录下新建mod_jk.conf文件
#加载mod_jk Module
LoadModule jk_module modules/mod_jk.so
#指定 workers.properties文件路径
JkWorkersFile conf/workers.properties
#指定哪些要求交给tomcat处理,\公众controller\"大众为在workers.propertise里指定的负载分配掌握器名
JkMount / controller
3.在httpd.conf同目录下新建 workers.properties文件
#这里可以配置任意多个Tomcat,此处配置了2个Tomat做事器.
#host和port根据自己实际配置.实例配置的是本机两个tomcat,分别利用不同的端口.避免冲突
#如果Tomcat不再同一机器上,没必要改端口的。
#server 列表
worker.list=controller,tomcat1,tomcat2
#========tomcat1========
worker.tomcat1.port=9988 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1 #server的加权比重,值越高,分得的要求越多
#========tomcat2========
worker.tomcat2.port=9999 #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
#指定此负载平衡器卖力的Tomcat运用节点。
worker.controller.balanced_workers=tomcat1,tomcat2 #指定分担要求的tomcat
#此处指定集群是否须要会话复制,如果设为true,则表明为会话粘性,不进行会话复制,当某用户的要求第一次分发到哪台
#Tomcat后,后继的要求会一贯分发到此Tomcat做事器上处理;如果设为false,则表明需求会话复制。
worker.controller.sticky_session=false #设为false,则表明需求会话复制。
修正Tomcat配置:
解释,如果修正了tomcat配置文件,最好将文件编码转换成utf-8格式.
由于实例中我们定义了2个tomcat处理分发.以是我们将tomcat的解压版本(zip)格式复制一份.用来分别担当不同的分发处理角色. 这里由于在一台机器上,以是我们利用zip版本的,当然你某个分发处理机器上只一个tomcat做事器的话,可以选择安装版本的.这里推举利用解压版的.tomcat6的配置办法跟7同等.
以tomcat-node1为实例
1.修正分发tomcat对应的service.xml文件,担保Apache对应的 workers.properties中的AJP13的connector的port.
<!-- 定义一个AJP 1.3 连接端口为9988 ,默认值为8009,这里我们改成我们自己定义的9988端口 --><Connector port=\公众9988\公众 protocol=\公众AJP/1.3\公众 redirectPort=\"大众8443\"大众/>
2.增加jvmRoute的值,担保同workers.properties里边配置的值同等
<!--增加jvmRoute,值为在Apache中配置的list集群结点中的值,这里定义为tomcat1结点--><Engine name=\"大众Catalina\"大众 defaultHost=\公众localhost\"大众 jvmRoute=\"大众tomcat1\"大众>
3.去掉默认注释掉的集群配置
<!--取消集群结点干系的注释,该句默认值注释掉的,我们须要配置集群以是去掉注释,让其起浸染--><Cluster className=\"大众org.apache.catalina.ha.tcp.SimpleTcpCluster\"大众/>
如果我们的tomcat结点分布在不同的机器上,那么我们的集群至此已经配置完成.去掉多余注释,显示做了修正的部位
修正前
<!-- Define an AJP 1.3 Connector on port 8009 --><Connector port=\"大众8009\"大众 protocol=\"大众AJP/1.3\"大众 redirectPort=\"大众8443\"大众/>
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name=\公众Catalina\"大众 defaultHost=\公众localhost\公众 jvmRoute=\"大众jvm1\"大众>--><Engine name=\公众Catalina\"大众 defaultHost=\公众localhost\"大众>
<!--For clustering--><!--
<Cluster className=\"大众org.apache.catalina.ha.tcp.SimpleTcpCluster\公众/>-->
修正后的tomcat-node1
<!-- 定义一个AJP 1.3 连接端口为9988 ,默认值为8009,这里我们改成我们自己定义的9988端口 --><Connector port=\"大众9988\"大众 protocol=\"大众AJP/1.3\公众 redirectPort=\"大众8443\"大众/>
<!--增加jvmRoute,值为在Apache中配置的list集群结点中的值,这里定义为tomcat1结点--><Engine name=\"大众Catalina\"大众 defaultHost=\公众localhost\"大众 jvmRoute=\"大众tomcat1\公众>
<!--取消集群结点干系的注释,该句默认值注释掉的,我们须要配置集群以是去掉注释,让其起浸染--><Cluster className=\"大众org.apache.catalina.ha.tcp.SimpleTcpCluster\"大众/>
修正后的tomcat-node2
<!-- Define an AJP 1.3 Connector on port 8009 --><Connector port=\"大众9999\"大众 protocol=\"大众AJP/1.3\"大众 redirectPort=\"大众8443\公众/>
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name=\公众Catalina\"大众 defaultHost=\"大众localhost\公众 jvmRoute=\"大众jvm1\公众>--><Engine name=\公众Catalina\公众 defaultHost=\"大众localhost\公众 jvmRoute=\"大众tomcat2\"大众>
<!--For clustering--><Cluster className=\"大众org.apache.catalina.ha.tcp.SimpleTcpCluster\公众/>
解释:这里的protocol=\公众AJP/1.3\"大众,连接以及jvmRoute须要担保同我们在Apache做事器中配置的works.properties同等.修正完后最好将service.xml文件的编码设置为utf-8格式.否则可能tomcat启动会出错.
4.实例中我们的两个tomcat结点在同一台机器上,以是还须要担保protocol=\"大众HTTP/1.1\"大众的端口不一致.不然本地的两个tomcat会起冲突
5.
配置Cluster(每个tomcat中都要修正) ,将原来的配置。(这个设置是紧张用以tomcat的集群。)
<Cluster className=\"大众org.apache.catalina.ha.tcp.SimpleTcpCluster\公众/>
修正为以下的代码:<Receiver port=”XX”/>port也要担保唯一性。
<Cluster className=\"大众org.apache.catalina.ha.tcp.SimpleTcpCluster\"大众 channelSendOptions=\公众6\公众>
<Manager className=\"大众org.apache.catalina.ha.session.BackupManager\"大众 expireSessionsOnShutdown=\"大众false\公众
notifyListenersOnReplication=\"大众true\公众 mapSendOptions=\"大众6\"大众/>
<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>
下面为笔者实例中办理同一台机器上多个tomcat做事器之间端口冲突做的修正.
Tomcat--node1
Tomcat-node2
<Server port=\"大众9995\"大众 shutdown=\公众SHUTDOWN\"大众>
……<Connector port=\"大众9990\"大众 protocol=\"大众HTTP/1.1\"大众
connectionTimeout=\"大众20000\"大众
redirectPort=\"大众8443\"大众/>
……
解释:这里的protocol=\"大众HTTP/1.1\"大众配置的干系端口之间不能冲突,而且也不能同本机其它运用程序占用的端口冲突.否则可能会报错.
实例测试
1.在web.xml文件中增加
<distributable/>
2.编写测试jsp代码
<%@ page language=\"大众java\公众 import=\"大众java.util.\"大众 pageEncoding=\"大众UTF-8\"大众%><%@ page import=\"大众java.text.SimpleDateFormat\公众%><!DOCTYPE HTML PUBLIC \"大众-//W3C//DTD HTML 4.01 Transitional//EN\"大众><html>
<head>
<title>Tomcat集群测试</title>
</head>
<body>
做事器信息:
<%
String dtm =new SimpleDateFormat(\公众yyyy-MM-dd hh:mm:ss\"大众).format(newDate());
System.out.println(\公众[\"大众+request.getLocalAddr()+\公众:\"大众+ request.getLocalPort()+\"大众]\公众+ dtm);
out.println(\"大众<br>[\公众+request.getLocalAddr()+\"大众:\"大众+request.getLocalPort()+\"大众]\"大众+ dtm+\公众<br>\"大众);
%>
session分发:
<%
session.setAttribute(\公众name\"大众,\"大众dennisit\"大众);
System.out.println(\公众[session分发] session id:\"大众+session.getId());
out.println(\公众<br>[session分发] session id: \"大众+ session.getId()+\公众<br>\"大众);
%>
</body></html>
3.测试负载均衡与session分发
将项目支配到每个集群结点中,即实例中的tomcat_node1和tomcat_node2,依次移动Apache和tomcat做事器,tomcat做事器之间的启动顺序随意.这里Apache端口利用默认的80.
上面是在FireFox中运行项目后刷新3次实行的效果,可以看到2个tomcat分发结点之间轮流负载.而且两台做事器上的session值是一样的.解释session分发成功.
两台Tomcat做事器日志打印输出结果:
缺点办理
问题:发生做事特定缺点:1
右键我的电脑->管理->系统工具->韶光查看器->运用程序,然后对应运用程序的右侧可以查看到缺点日志.
笔者缺点:
The Apache service named reported the following error:>>> httpd.exe: Syntax error on line 484 of D:/Apache2.2/conf/httpd.conf: Syntax error on line 1 of D:/Apache2.2/conf/mod_jk.conf: Cannot load D:/Apache2.2/modules/mod_jk.so into server: \xd5\xd2\xb2\xbb\xb5\xbd\xd6\xb8\xb6\xa8\xb5\xc4\xb3\xcc\xd0\xf2\xa1\xa3
缺点缘故原由,这个文件要跟Apache版本对应.我的Apache版本为2.2的,最初搞的为 tomcat-connectors-1.2.37-windows-i386-httpd-2.0.x版本以是缺点.
修复后启动
附录:
Apache与Tomcat的差异:
Apache是一个web做事器环境程序,可以作为web做事器利用。不过只支持静态网页,如(asp,php,cgi,jsp)等动态网页的就显得无能为力。
如果想让做事器也能处理动态页面,那么就须要Tomcat。
当处理静态页面时,Tomcat不如Apache迅速。Tomcat不象Apache一样可配置(如:可以作为一个代理做事器,即loadbalaner)。
Tomcat不象Apache一样强壮。
基于以上缘故原由,一个现实的网站利用一个Apache作为Web做事器,为网站的静态页面要求供应做事;并利用Tomcat做事器作为一个Servlet/JSP插件,显示网站的动态页面。
Apache,Tomcat负载均衡和集群:
对要求的处理又有两种不同的办法:负载平衡、状态复制(即集群).
负载平衡:每台做事器都是独立的,只是对要求的负载进行平衡,而不对状态(SESSION)进行复制。
状态复制(集群):前辈行负载平衡,再在各做事器间复制运用状态。
Apache+Tomcat构建企业级运用
1.Apache紧张用来解析静态文本,如html,tomcat也有此功能,但apache能大大提高效率,对付并发数较大的企业级运用,能更好的显示Apache的高效率;
2.Tomcat 用来解析jsp,servlet等,所有的客户要求首先会发送到apache,如果要求是静态文本则由apache解析,并把结果返回给 客户端,如果是动态的要求,如jsp,apache会把解析事情交给tomcat,由tomcat进行解析(这首先要两者现实整合),tomcat解析完 成后,结果仍是通过apache返回给客户端,这样就可以达到分工互助,实现负载均衡,提高系统的性能!
搭建过程中碰着的一些问题:
1、当Apache在非根目录下时可能涌现如下缺点:
httpd: Syntax error on line 39 of D:/wwwroot/Apache24/conf/httpd.conf: ServerRoot must be a valid directory
该缺点只需将httpd.conf下Define SRVROOT修正为Apache所在目录。
#Define SRVROOT \"大众/Apache24\"大众
#指向对应Apache目录
Define SRVROOT \公众D:/wwwroot/Apache24\"大众
2、若集群成功搭建后访问页面仍在Apache默认页面:
查看httpd.conf下Virtual hosts是否已注释,Apache2.4默认开启,将Include conf/extra/httpd-vhosts.conf注释。
3、ApacheMonitor启动提示The requested operation has failed!
查看Apache24\logs\error.log下缺点提示,或利用命令行httpd.exe -w -n \"大众Apache2.4(Apache做事名)\"大众 -k start调试
做事安装:httpd.exe -k install
Linux下Apache与多个Tomcat 集群负载均衡
http://www.linuxidc.com/Linux/2012-01/51731.htm
Nginx Tomcat 集群负载均衡办理条记
http://www.linuxidc.com/Linux/2013-07/86827.htm
实例详解Tomcat组件安装+Nginx反向代理Tomcat+Apache利用mod_jk和mod_proxy反向代理和负载均衡 http://www.linuxidc.com/Linux/2013-06/85290.htm
CentOS 6.5下利用Rsyslog+LogAnalyzer+MySQL支配日志做事器
http://www.linuxidc.com/Linux/2014-06/103836.htm
Apache+Tomcat 环境搭建(JK支配过程)
http://www.linuxidc.com/Linux/2012-11/74474.htm
Tomcat 的详细先容:http://www.linuxidc.com/Linux/2013-10/91681.htm
Tomcat 的下载地址:http://tomcat.apache.org/download-60.cgi