您的位置:首页 > 运维架构 > Tomcat

Apache与Tomcat集群(已验证Linux下原理相同)

2012-11-17 16:33 211 查看
转载请注明出处:http://blog.csdn.net/z787326

如有错漏欢迎交流

本文实现的是Apache+Tomcat的集群配置,在windows下完成,可以实现简单的负载均衡。

环境搭建

Apache

第一步我们来搭建一个Apache,你可以去官网下载一个http://apache.etoak.com//httpd/,我下载的是httpd-2.2.22-win32-src.zip,因为2.2.22以上的版本,我就没找到windows下的包了。

获得安装包是一个msi文件,开始安装,安装过程我就不截图了,安装过程中默认的端口是80,如果你已经有IIS等占用的话,需要修改。安装完成后你可以通过命令提示行的方式或者通过系统托盘中的管理工具来启动Apache服务,Apache的默认访问路径是其目录下的htdocs文件夹(类似Tomcat下的webapps中的ROOT),htdocs中已经有了一个静态的HTML文件index.html,启动我完成后通过浏览器访问localhost:你的端口号(若是80可不写),如果能成功打开页面看见It works!,说明Apache安装成功了。



Tomcat

Tomcat的版本没有限制,6或7都可以,我们用两个Tomcat来做测试,两个Tomcat需要相同的版本,下载去http://tomcat.apache.org/download-60.cgi。完成后解压两个。修改conf下的server.xml配置文件。我们先不进行集群的相关配置,先配置使得一个自己上能够同时运行2个Tomcat。需要修改两个地方。

1.22行左右



这个端口是用来监听关闭Tomcat请求的,只要Telnet到8005端口,输入SHUTDOWN,就可以关闭Tomcat的服务了,所以SHUTDOWN也要进行修改,原因你知道的。

2.69行左右



这个端口是Tomcat创建用来监听来自客户端请求的我将一个设置成8081,另一个Tomcat保持默认的8080不变。

修改完这两个端口号后,在浏览器里分别访问localhost:8080和localhost:8081,如果都能看到那只猫,说明你tomcat的准备OK了。

集群配置

获取mod_jk

Tomcat Connector JK 是连接器。用于和其他WEB服务器整合。我们下载一个与Apache整合的JK,这里需要注意的是JK的版本号需要和你Apache的版本号相匹配。http://tomcat.apache.org/connectors-doc/news/20120301.html#31%20May%20-%20JK-1.2.37%20released下载地址,我下的是1.2.32支持Apache2.2的。JK大的版本有1和2,不知道什么原因,2一段时间后就不更新了,我们使用1.x的版本就ok了。将压缩包中的mod_jk解压到Apache目录下的modules文件夹中。

Apache的集群配置

找Apache的conf文件夹中,有一个httpd.conf文件,你要可以将我们需要的配置直接加入文件的尾部,或者写一个新的conf文件,在httpd.conf中引入新文件。我使用后者。新建一个mod_jk.conf文件,代码如下。

#加载插件
LoadModule jk_module modules/mod_jk.so
#指定JK需要的配置文件
JkWorkersFile conf/workers.properties
JkMount /*.jsp controller
需要注意的一点是,所有配置中的路径,都需要将文件系统路径中的 \ 改为 / 否则找不到文件。

上面配置中的最后一行,是指定通过url来判断将哪些请求交给tomcat去处理,controller需要与workers.properties中配置的负载均衡控制器的名称相对应。

再新建一个workers.properties在其中配置我们tomcat的信息和控制器的信息,代码如下

#控制器列表
worker.list = controller
#========tomcat1========
#指定基于ajp通讯的端口,需要与tomcat server.xml中的配置对应
worker.tomcat1.port=9090
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13
#权重,权重越高被调用的可能性越大
worker.tomcat1.lbfactor = 1
#========tomcat2========
worker.tomcat2.port=9091
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1
#========名为controller负载均衡控制器========
worker.controller.type=lb
#tomcat1,tomcat2需要与Tomcat server.xml配置中的jvmRoute对应
worker.controller.balanced_workers=tomcat1,tomcat2
#下面两个参数是控制session是否同步和是否有粘性
worker.controller.sticky_session=false
worker.controller.sticky_session_force=1
一些简单的参数就不一一解释了,这里的ajp是一种定向包协议,基于Tcp连接,利用二进制传输可读性数据。

我们经常会遇到一种情况,有两个服务器,并不是同时都提供服务的,只有当A服务器出现问题时,B服务器才马上接替A的工作,提供服务,只要加上一个参数就可以实现,例如

work.tomcat1.redirect=tomcat2,只有tomcat1出现问题的时候,才使用tomcat2。

worker.controller.sticky_session和worker.controller.sticky_session_force是控制session是否复制和有粘性的,取值有布尔和数值两种。

1=true,0=falase

worker.controller.sticky_session:falseworker.controller.sticky_session:true
worker.controller.sticky_session_force:false每次都会请求都会跳转到另外tomcat,并复制原有的session每次请求都在一个tomcat,在使用的tomcat不能提供服务了才会跳转到另一个tomcat,但session不会复制
worker.controller.sticky_session_force:true每次都会请求都会跳转到另个tomcat,但不复制session每次请求都在一个tomcat,在使用tomcat不能提供服务了,返回:服务端会返回503 Service Temporarily Unavailable
这样就完成了Apache的配置

Tomcat配置

修改conf下server.xml

在90行左右,如下图

第一处,这是tomcat定义的一个JD Connector,使用ajp1.3协议,用来接收从其他服务器转发而来的请求,我们的两个tomcat,需要设置不同的端口号,分别设置成9090与9091。

第二处,这里的名字需要跟你在之前在workers.properties中设置的保持一致。

第三处,这句本来是注释掉的,去掉注释就可以了,这里是tomcat对集群时,处理数据同步的一种解决方案,前期我们不深究其中的原理,你可能在网上看见这里还需要配置很多的参数,但是一般默认的够用了,我们暂时什么都不加。

到此,所有的配置都结束了,准备测试。

测试

我们主要测试是否实现了负载均衡和session的同步,新建一个web工程,编写一个jsp文件,附上代码

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" import="java.util.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
Server Info:
<%
out.println(request.getLocalAddr()+":"+request.getLocalPort()+"<br />");
out.println("<br />ID"+session.getId()+"<br />");
String dataName = request.getParameter("dataName");
System.out.println(dataName);
if(dataName!=null&&dataName.length()>0){
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.println("<b>Session数据列表</b><br />");
Enumeration e = session.getAttributeNames();
while(e.hasMoreElements()){
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println(name+"="+value+"<br />");
}
%>
<form action="routeTest.jsp" method="post">
名称:<input type="text" size="20" name="dataName" /><br />
值:<input type="text" size="20" name="dataValue" /><br />
<input type="submit" />
</form>
</body>
</html>
网络上流程很广的代码,不解释了。

然后将工程分别部署到你的Apache和两个tomcat上,将三者都启动起来,在浏览器里直接访问apache下的jsp页面,效果如下

Apache只是接收了用户请求,而后进行转发,而红框部分显示的tomcat,才是具体处理用户请求并相应的服务器。

好了,到这里简单的Apache和Tomcat集群就实现了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: