关于APACHE负载均衡与TOMCAT集群配置的资料网上有很多,但是几乎是一个版本一个样,而且在配置的过程中,可能是由于版本的不同,或者系统环境的不同,出现各种各样的错误,下面将我自己在虚拟机下配置的过程记录下来,由于设备不够,所以tomcat节点与apache服务器都配置在同一Centos系统下。
一、配置环境:
1、Centos 6.3 32位Linux系统;
2、Apache版本:httpd-2.2.9.tar.gz;
3、Tomcat版本:apache-tomcat-6.0.35.tar.gz;
4、apr、apr-util、pcre依赖包版本:直接利用httpd下自带的版本即可;
5、zlib、zlib-devel、autoconf、libtool依赖包版本:直接采用yum命令安装即可;
6、JK版本:tomcat-connectors-1.2.37-src.tar.gz;
二、安装过程:
1、安装Apache:
A、解压httpd-2.29.tar.gz并移动到/usr/local目录下:
[root@localhost soft]# tar -zxvf httpd-2.29.tar.gz
[root@localhost soft]# mv httpd-2.29 /usr/local/httpd-2.2.9
B、分别进入httpd-2.2.9/srclib目录下apr、apr-util、pace目录,先行安装apr、apr-util、pace等依赖包:
安装apr:
[root@localhost apr]# ./configure --prefix=/usr/local/apr
[root@localhost apr]# make
[root@localhost apr]# make install
注:不安装apr一般会出现如下错误:
checking for APR... no
configure: error: APR not found . Please read the documentation
安装apr-util:
[root@localhost apr-util]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@localhost apr-util]# make
[root@localhost apr-util]# make install
注:不安装apr-util一般会出现如下错误:
checking for APR-util... no
configure: error: APR-util not found . Please read the documentation
安装pcre:
[root@localhost pcre]# ./configure --prefix=/usr/local/pcre
[root@localhost pcre]# make
[root@localhost pcre]# make install
注:--prefix=/usr/local/apr、--prefix=/usr/local/apr-util、--prefix=/usr/local/pcre分别指apr、apr-util、pace的安装目录。
安装Apache所需的zlib与zlib-devel依赖包:
[root@localhost soft]# yum install zlib
[root@localhost soft]# yum install zlib-devel
注:不安装zlib与zlib-devel一般会出现如下错误:
checking for zlib location... not found
checking whether to enable mod_deflate... configure: error: mod_deflate has been requested but can not be built due to prerequisite failures
进入httpd-2.29目录安装Apache:
[root@localhost httpd-2.29]# ./configure --prefix=/usr/local/apache --enable-modules=so --enable-mods-shared=all --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/bin
[root@localhost httpd-2.29]# make
[root@localhost httpd-2.29]# make install
注:--prefix=/usr/local/apache指apache的安装目录,针对不同的系统版本或软件版本,可能会出现其他问题,请查阅其他相关资料。
C、进入/usr/local,并查看是否安装成功:
[root@localhost local]# ls -ls
显示结果如图:
从图中可以看到,apr、apr-util、apache已经安装完成。
D、验证Apache是否安装成功,可以执行如下命令:
启动apache命令:
[root@localhost local]# /usr/local/apache/bin/apachectl -k start
关闭防火墙:
[root@localhost local]# service iptables stop
在浏览器中输入:http://192.168.31.132/,如果显示“It works!”结果,就表示Aapche安装成功,否则安装失败。
关闭apache命令:
[root@localhost local]# /usr/local/apache/bin/apachectl -k stop
2、JK的配置:
A、解压tomcat-connectors-1.2.37-src.tar.gz并移动到/usr/local目录下:
[root@localhost soft]# tar -zxvf tomcat-connectors-1.2.37-src.tar.gz
[root@localhost soft]# mv tomcat-connectors-1.2.37-src /usr/local/jk
B、安装MOD_JK所需的autoconf与libtool依赖包:
[root@localhost soft]# yum install autoconf
[root@localhost soft]# yum install libtool
注:不安装autoconf与libtool一般会出现如下错误:
autoconf: command not found
libtoo: command not found
C、进入/usr/local/jk目录,进行安装MOD_Jk:
[root@localhost jk]# ./buildconf.sh
[root@localhost jk]# ./configure --with-apxs=/usr/local/apache/bin/apxs --with-java-home=$JAVA_HOME --with-java-platform=2 --enable-jni
[root@localhost jk]# make
[root@localhost jk]# make install
3、TOMCAT的配置:
A、解压apache-tomcat-6.0.35.tar.gz并复制到/usr/local目录下:
[root@localhost soft]# tar -zxvf apache-tomcat-6.0.35.tar.gz
[root@localhost soft]# cp -ri apache-tomcat-6.0.35 /usr/local/tomcat1
[root@localhost soft]# cp -ri apache-tomcat-6.0.35 /usr/local/tomcat2
B、配置Tomcat环境变量,在“Centos系统之(一)关于JDK、TOMCAT、ANT、SVN等配置文档”博客中已经进行了详细的介绍,不再赘述:
C、修改Tomcat服务器的网络端口:
分别进入tomcat1和tomcat2目录的conf目录server.xml,采用vi编辑器修改相关的网络端口:
[root@localhost conf]# vi server.xml
C1、 分别将
注:为了在配置过程中方便记忆和区分,tomcat1的端口采用1****或****1,tomcat2的端口采用2****或****2的方式配置。
C2、 分别将
C3、 分别将
D、设置Tomcat服务器的
在server.xml里带jvmRoute的
分别将
E、设置Tomcat服务器的
注:这是从Tomcat官方文档http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html中截取的默认配置。
注:如果两个tomcat是部署在同一台机器上的话要注意修改Receiver标签的端口号,4000不能重复。
F、测试Tomcat1和Tomcat2是否可以正常访问:
[root@localhost bin]# sh startup.sh
分别在浏览器中输入:http://192.168.31.132:10001或者http://192.168.31.132:20001,如果显示出Tomcat,则配置成功,否则配置失败。
4、Apache服务器与Tomcat集群配置:
A、进入Apache的安装目录配置文件httpd.conf:
[root@localhost conf]# vi httpd.conf
在文件的最后加入以下代码:
# Load mod_jk module
LoadModule jk_module modules/mod_jk.so
# Specify jk log file.
JkLogFile /var/log/mod_jk.log
# Specify jk log level [debug/error/info]
JkLogLevel info
# Specify workers.properties, this file tell jk:
# how many nodes and where they are.
JkWorkersFile conf/workers.properties
# Specify which requests should handled by which node.
JkMount /* controller
注: 关于mod_jk配置项的详细内容,可参考:http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html。
B、从上述文件中的JkWorkersFile conf/workers.properties配置可以知道,我们需要在conf目录下新建workers.properties文件描述集群结点的情况,其内容如下:
#所有节点列表,其中controller是一个逻辑结点,负责负载均衡控制,
#如果JkMount中的URL指定给了controller就表示这个请求会被自动散列到某个物理节点上。
#注意:真正负责处理请求的tomcat的名称(这里就是tomcat1,tomcat2)必须于它们在conf/server.xml
#文件中配置的jvmRout的属性值是一致的!
worker.list = controller,tomcat1,tomcat2
#========tomcat1========
worker.tomcat1.port=10009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat1.host=192.168.31.132 #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
#========tomcat2========
worker.tomcat2.port=20009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat2.host=192.168.31.132 #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
#========controller,负载均衡控制器========
worker.controller.type=lb
worker.controller.balance_workers=tomcat1,tomcat2 #指定分担请求的tomcat,旧版本中的balanced_workers,已不再推荐使用!
worker.controller.sticky_session=1 #sticky_session为1表示,
#当某client的session创建之后,后续由该客户端发起的请求,即session的所有请求都始终由第一次处理该请求的结点负责处理(除非该结点挂掉)
所有配置均已完成,启动两个tomcat和apache后,部署相关的java工程到两个tomcat中,如果配置正确,通过apache访问日志会发现,请求被随机分配。
5、如果是发布应用,在发布的应用中web.xml文件中,加入
三、负载均衡与集群服务器验证:
1、验证目标:
A、测试session信息是否丢失,即同一个请求在不同刷新过程中是否改变,如果改变则配置失败,反之配置成功;
B、测试session是否在集群中的各个节点中成功复制,复制成功则才能实现集群的目的:负载均衡;
2、在此引用一个网络上的测试session的例子,在Tomcat1与Tomcat2的webapps下建立test目录,并且建立测试文件hello.jsp:
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
Cluster App Test
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"
");%>
<%
out.println("
ID " + session.getId()+"
");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("Session 列表");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"
");
System.out.println( name + " = " + value);
}
%>
3、在test目录下新建WEB-INF目录和web.xml,在
4、启动两个Tomcat节点和Apache服务,进行测试,在浏览器中输入:http://192.168.31.132/test/hello.jsp:
结果如下:
1、ID A13F7FD30C2ACA712BDF6EFAF9B7FD38.tomcat2
Session 列表1 = 1
2、ID A13F7FD30C2ACA712BDF6EFAF9B7FD38.tomcat1
Session 列表1 = 1
3、ID A13F7FD30C2ACA712BDF6EFAF9B7FD38.tomcat2
Session 列表1 = 1
2 = 5
4、ID A13F7FD30C2ACA712BDF6EFAF9B7FD38.tomcat1
Session 列表1 = 1
3 = 4
2 = 5
注: 1、通过这些数据可以知道,前面的sessionId是固定没变得,当我们不停的点击提交时,小数点后面的内容变了,实际上可以知道是哪个节点处理了当次请求,说明sessionId在各个节点的复制成功了,达到了我们预想的测试目的B;
2、通过每条数据下得Session 列表可知:当我们增加新的数据的时候,前面存入session里面的数据并没有丢失,说明我们预想测试目的A成功了;
3、其实我们从两个Tomcat的控制台也可以看得出来,sessionId在不同节点是相同的;
4、关闭掉任何一个节点,请求都可以执行,而且sessionId是不变的。
四、负载均衡与集群项目热部署:
对于Java应用程序来说,热部署就是在运行时更新Java类文件。在基于Java的应用服务器实现热部署的过程中,类装入器扮演着重要的角色。大多数基于Java的应用服务器,包括EJB服务器和Servlet容器,都支持热部署。类装入器不能重新装入一个已经装入的类,但只要使用一个新的类装入器实例,就可以将类再次装入一个正在运行的应用程序。
在/usr/local/tomcat1/conf目录下的server.xml文件中的
注:本人也是第一次采用热部署的配置来处理相关问题。根据从网上查询到的资料了解,关于项目的热部署一直都在争论之中,有的人说高效率,有的人说不安全,总之一句话,仁者见仁智者见智。根据网上的一些IT同仁总结的优点缺点,我个人没有什么经验,所以我个人建议,除非是项目不得已而采取,还是采用冷部署为好吧,即手动上传或者采用SHELL脚本的形式,就当为了项目安全多考虑一点而已吧。