使用Apache+tomcat搭建集群,可以使用Apache的 mod_proxy_ajp 也可以使用tomcat的mod_jk作为modules。本次使用的是 tomcat的mod_jk
Apache+tomcat集群中,对session有两种处理方法,一个是session复制,意思为,多个节点之间共享session。这样的好处是,一个节点挂掉后,不影响当前登录的用户。另外一种则是,同一个用户的请求都发送给同一个节点,这样不同节点之间不再有session信息的复制。但当某个节点挂掉后,当前用户的登录信息也会丢失。
首先应进行准备工作。jdk就不必说了,本地是jdk1.6.12
tomcat 是apache-tomcat-6.0.35
然后应再准备Apache的环境。首先到Apache的官网去下载对应的软件。官网下载的首页不在提供windows版本的二进制文件下载,移到了另外一个页面。http://apache.fayea.com/apache-mirror//httpd/binaries/win32/
选择:httpd-2.2.25-win32-x86-no_ssl.msi 保险起见,下载一个2.2版本的。
下载到本地后,执行安装, 注意记住安装的路径,因为之后还要操作这个路径。 若手动指定路径,最好不要有特殊字符。
安装完成后,在桌面右下角会有一个标志。可以在此处进行服务的启动或停止。安装完成后,服务默认启动。
默认端口为80.访问localhost 看到欢迎页面,即证明Apache安装成功。
这步很简单。
然后准备tomcat。为方便起见,将准备两个tomcat,将两个tomcat放到同一个文件夹下。
然后准备mod_jk 。下载地址:http://apache.fayea.com/apache-mirror/tomcat/tomcat-connectors/jk/binaries/windows/
下载 : tomcat-connectors-1.2.40-windows-i386-httpd-2.2.x.zip
注意要和Apache的版本对应起来。
下载完成后,解压该文件,然后将其中的 mod_jk.so 拷贝到 Apache安装目录下的 modules 文件夹下 如 G:\apache2.2\modules
然后到Apache根目录下,找到conf文件夹的 httpd.conf,打开这个文件,然后在最下面增加如下代码:
include "G:\apache2.2\conf\mod_jk.conf"
这是告诉Apache,扫描这个文件。然后需要再新建这个文件。 在conf目录下
代码如下:
#加载mod_jk Module
LoadModule jk_module modules/mod_jk.so
# 配置 mod_jk
#加载集群中的workers
JkWorkersFile conf/workers.properties
#指定jk的日志输出文件
JkLogFile logs/mod_jk.log
#指定日志级别
JkLogLevel warn
#指定哪些请求交给tomcat处理,"controller"为在 workers.propertise里指定的负载分配控制器名 所有的请求都交给 control
JkMount /*.* controller
从内容可看到,还需要新建个properties文件,用来配置集群环境中的具体服务器
新建 workers.properties
内容如下:
#server 列表
worker.list=controller,tomcat1,tomcat2
#========tomcat1========
#节点一对应的端口号,对应ajp协议的端口号,tomcat同时会监听该端口
worker.tomcat1.port=18009
#主机地址,本地则是localhost,服务器则填写实际地址
worker.tomcat1.host=localhost
#ajp协议,tomcat将监听上面的端口,并获取通过该端口的ajp协议的请求
worker.tomcat1.type=ajp13
#加权比重,数值越大,则分得的请求越多
worker.tomcat1.lbfactor=1
#========tomcat2========
worker.tomcat2.port=28009
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
#========controller,负载均衡控制器========
#server名为controller,用于负载均衡
worker.controller.type=lb
#重试次数
worker.retries=3
worker.controller.balance_workers=tomcat1,tomcat2
#粘性Session(默认是打开的) 当该属性值=True(或1)时,代表Session是粘性的, 即session粘着。若设置true,则同一个浏览器的请求(cookie相同)将会被分发到同一个#tomcat(节点)
#即同一Session在集群中的同一个节点上处理,Session不跨越节点。在集群环境中,一般将该值设置为False
worker.controller.sticky_session=false
修改两个tomcat,分别进入tomcat的conf文件夹下server.xml文件,修改其对应端口。
此例部署在同一机器,因此需要修改tomcat 中 http协议对应的端口。
之后是,tomcat 监听shutdown命令的端口。
然后是 tomcat 监听ajp协议的端口
<Connector port="18080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="18009" protocol="AJP/1.3" redirectPort="8443" />
<Server port="18005" shutdown="SHUTDOWN">
注意,ajp协议的端口,应该和节点配置文件中,配置的两个tomcat节点中对应的端口一致。Apache会根据配置文件中的端口号去寻找对应的服务。
继续修改server.xml 将其对应的
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
打开。将其注释去掉。有的文章还说,将
<Engine name="Catalina" defaultHost="localhost">
这一句中增加上 jvmRoute 属性, 测试后,不加也没问题。Apache是根据端口号进行请求的转发处理。
最后,在tomcat的conf目录下,web.xml 最后增加 一句
<distributable/>
这句的意思是,允许该tomcat实行session的复制黏贴
至此,环境搭建完成。
测试一下
新建一个项目ROOT,里面只放index.jsp即可。
index.jsp内容如下:
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
</head>
<body>
<%
System.out.println(session.getId());
out.println(session.getId());
%>
</body>
</html>
然后 访问 http://localhost 这个地址。摁住F5疯狂刷新。
观察效果。
浏览器输出了sessionid。而且两个控制台也分别输出了sessionid。并且三者统一。证明session成功实现了复制!