Tomcat中的集群原理是通过组播的方式进行节点的查找并使用TCP连接进行会话的复制。

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

环境说明:

操作系统:window xp

Javasdk: 1.7 
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= #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor= #server的加权比重,值越高,分得的请求越多 #========tomcat2======== worker.tomcat2.port= #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat2.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor= #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会起冲突

下面为笔者实例中解决同一台机器上多个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(new Date());
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 of D:/Apache2./conf/httpd.conf: Syntax error on line of D:/Apache2./conf/mod_jk.conf: Cannot load D:/Apache2./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  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

Apache + Tomcat + mod_jk实现集群服务的更多相关文章

  1. Apache + Tomcat + mod_jk实现集群服务及session共享

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

  2. 2.Apache + Tomcat + mod_jk实现集群服务

    转自:http://www.cnblogs.com/dennisit/p/3370220.html Tomcat中的集群原理是通过组播的方式进行节点的查找并使用TCP连接进行会话的复制. 实现效果:用 ...

  3. Apache + Tomcat +mod_jk 实现集群

    实现效果:用apache 分发请求到tomcat中的对应的项目 环境说明: 操作系统:window7 Javasdk: 1.7 Apache: 2.2.14    (本地安装路径:D:\Apache2 ...

  4. Linux平台上搭建apache+tomcat负载均衡集群

    传统的Java Web项目是通过tomcat来运行和发布的.但在实际的企业应用环境中,采用单一的tomcat来维持项目的运行是不现实的.tomcat 处理能力低,效率低,承受并发小(1000左右).当 ...

  5. Apache+tomcat实现应用服务器集群

    Ngnix/Apache比较 Nginx:Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行.其特点是占有内存少,并发能力 ...

  6. Apache+Tomcat负载均衡集群搭建

    1.所需软件 apache_2.2.4-win32-x86-no_ssl.apacheserver mod_jk-apache-2.2.4连接器,连接apache和tomcat apache-tomc ...

  7. 1.Apache+Tomcat负载均衡+集群配置

    1.本文Apache+Tomcat集群配置 基于最新的Apache和Tomcat,具体是2011年4月20日最新的Tomcat和Apache集群和负载均衡配置. 准备环境 Apache Apache是 ...

  8. Apache+tomcat+mod_jk+centos6.2负载均衡集群配置--转载

    转载地址:http://blog.163.com/chenhui_java/blog/static/17267249420128101191860/ 注: 由于长期受转载毒害,所以本人日志均是原创:其 ...

  9. Apache+Tomcat构建Tomcat负载均衡集群

    一.环境介绍 二.安装后端服务器 三.安装前端Apache服务 四.配置Apache使用mod_jk模块实现代理及负载均衡 五.配置Apache基于mod_proxy模块实现代理及负载均衡 六.论坛安 ...

随机推荐

  1. hbase shell command

    进入hbase shell console $HBASE_HOME/bin/hbase shell 如果有kerberos认证,需要事先使用相应的keytab进行一下认证(使用kinit命令),认证成 ...

  2. spring-boot-cli

  3. win7下如何建立ftp服务器

    前段时间正在做一个项目,需要上传东西到ftp服务器,纠结于如何建立ftp服务器.经过一番摸索.终于成功建立ftp服务器.现将我的经验跟大家分享一下.不足之处还望多多指点! 步骤/方法 首先在本地机器上 ...

  4. 史上最全的Linux常用命令

    系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...

  5. bs4_2

     QQ:231469242 欢迎交流 Parsing HTML with the BeautifulSoup Module Beautiful Soup是用于提取HTML网页信息的模板,Beautif ...

  6. Java——private default protected public访问控制权限

    访问控制权限 protected范例

  7. 仿照jquery封装一个自己的js库(一)

    所谓造轮子的好处就是复习知识点,加深对原版jquery的理解. 本文系笔者学习jquery的笔记,记述一个名为"dQuery"的初级版和缩水版jquery库的实现.主要涉及知识点包 ...

  8. Why is applicationhost.config still being added to source control even thought it's in gitignore

      Why is applicationhost.config still being added to source control even thought it's in gitignore g ...

  9. [Unity] 精灵动画制作中需要注意的一些问题

    1. 为精灵添加了动画控制器,UpdateMode设置为了Animate Physics,精灵就不受控制了,在游戏中不断的晃动,不受重力影响向下掉等奇葩问题出现了. 解决办法: 此类问题,除掉刚体设置 ...

  10. php实现发送邮件

    smtp.php: <?php class smtp {     /* Public Variables */     var $smtp_port;     var $time_out;    ...