本文为采用Apache+Tomcat实现集群的环境搭建篇,只是单纯的实现运行的效果,所以并无太多深入的研究,毕竟IT这行的学习方法一般都是
先know how,再know why。 先把效果做出来,再去深究其原理。
一、本文环境说明:
操作系统:window7 32
JDK 1.7
tomcat 7
Apache 2.4.16-x86(下载地址:http://www.apachehaus.com/downloads/httpd-2.4.16-x86.zip)
mod_jk.so(JK是一款 Apache/IIS用来连接后台Tomcat的模块,支持集群和负载均衡,下载时需注意JK和Apache对应版本需保持一致,本文Apache是采用2.4版本的所以需下载对应的jk版本)
二、环境搭建
1.安装JDK
2.安装Apache
我在D盘根目录下新建了文件夹‘MyServers’,并将免安装版的Apache解析至该文件夹下
3.解压Tomcat至MyServers文件夹,并复制四份,分别取名为tomcat1,tomcat2,tomcat3,tomcat4以加以区分
4.将下载好的mod_jk.so复制至Apache目录的modules文件下
我的Myservers文件夹截图如下:
三、环境配置
1.修改Apache的配置文件httpd.conf(我的路径为:D:\MyServers\Apache24\conf),打开之后在末尾添加:
#加载mod_jk模块
LoadModule jk_module modules/mod_jk.so
#指定workers.properties文件的路径
JkWorkersFile conf/workers.properties
#指定mod_jk的日志文件的路径
JkLogFile logs/mod_jk.log
#指定mod_jk的日志级别
JkLogLevel debug
#记录Tomcat Worker名称、网址和每个请求的时间
#JkRequestLogFormat “%w %U %T”
#指定哪些请求交给Tomcat处理,loadbalancer为在workers.properties中配置的分发器名
JkMount /*.do loadbalancer
JkMount /*.jsp loadbalancer
其中JKMount
指定哪些请求交给tomcat处理,"loadbalancer"为在workers.propertise里指定的负载分配控制器名,此处我们将后缀名为.do以及后缀名为.jsp的请求
交由Tomcat来处理
2.在httpd.conf同目录下新建workers.propertise文件
并添加以下内容:
3、修改接受分发请求的Tomcat的server.xml文件来与Apache的work中的workers.properties中的各端口对应#server列表 worker.list = loadbalancer #========tomcat1======== #ajp13端口号 worker.tomcat1.port=11009 #tomcat的主机地址,如不为本机,请先写ip地址 worker.tomcat1.host=localhost #连结tomcat所用的协议类型 worker.tomcat1.type=ajp13 #负载平衡因数(只有启动了负载平衡才有用),值越高,分得的请求越多 worker.tomcat1.lbfactor = 1 #========tomcat2======== worker.tomcat2.port=12009 worker.tomcat2.host=localhost worker.tomcat2.type=ajp13 worker.tomcat2.lbfactor = 1 #========tomcat3======== worker.tomcat3.port=13009 worker.tomcat3.host=localhost worker.tomcat3.type=ajp13 worker.tomcat3.lbfactor = 1 #========tomcat4======== worker.tomcat4.port=14009 worker.tomcat4.host=localhost worker.tomcat4.type=ajp13 worker.tomcat4.lbfactor = 1 #========controller,负载均衡控制器======== #指定控制器类型 worker.loadbalancer.type=lb #指定参与负载均衡的tomcat名称列表 worker.loadbalancer.balanced_workers=tomcat1,tomcat2,tomcat3,tomcat4 #sticky_session:指明session是否是黏性的。其默认值为1(true),表示使用黏性session, #即一个会话中的请求始终由一个tomcat进行处理;为0时表示使用非黏性session,即同一会话中的请求 #可由不同的tomcat处理,各tomcat之间需同步Session worker.loadbalancer.sticky_session=0 # sticky_session_force:指明session的黏性是否是绝对的、强制的。其默认值为0(false),表示非强制,当集群中某台服务器多次请求没响应时,则将请求转发到其它tomcat处理;为1时表示强制,即使某台服务器宕机也不会将请求转发到其它服务器。 worker.loadbalancer.sticky_session_force=0
3.1修改Server Port(非必需,只有当一台机器上需部署多个tomcat是才需要修改以达到端口互斥) <Server port="11005" shutdown="SHUTDOWN"> 3.2 修改类型为http1.1的Connector的端口 (或者直接将该Connector的配置注释掉,该步骤也是非必需的,其原因和3.1一样,我们的集群中根本就没有用到Http协议而是采用的Ajp协议) <Connector port="11080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 3.3 配置Ajp13的Port,必须和workder.properties的端口保持一致 <Connector port="11009" protocol="AJP/1.3" redirectPort="8443" /> 3.4 配置JvmRoute,其值必须和workers.properties中的对应名称保持一致 <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"> 3.5 配置Cluster(将原有Cluster的注释放开即可) <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
四、进行测试
1.在每个Tomcat的webapp下新建web项目,并在web.xml中加入<distributable/>
的属性,该属性告诉servlet/JSP容器,编写的应用将在分布式Web容器中部署如下所示:2、在web项目中创建test.jsp用来测试负载均衡以及session分发,内容如下:<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true"> <display-name>Tomcat Balancing</display-name> <distributable /> </web-app>
3、确定四个tomcat的webapp都部署了web项目之后,启动四个Tomcat,并启动Apache,Apache默认端口为80,打开浏览器访问http://localhost/TestWeb/test.jsp其中TestWeb是我们Tomcat下的web项目名称。不断刷新浏览器,便会交替出现如下所示:<%@ 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>Apache+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>
说明4个tomcat分发节点之间轮流负载,并且我们发现他们的Session是相同的,即Session分发成功