实现效果:用apache 分发要求到tomcat中的对应的项目

环境解释:

操作系统:window 通用

jsp轮流显示图片整顿项目设置装备摆设负载平衡的进程给年夜家参考 SQL

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