Apache+Tomcat+jk集群
原理:JK插件的负载均衡器根据在worker.properties中配置的lbfactor(负载平衡因数),负责为集群系统中的Tomcat服务器分配工作负荷,以实现负载平衡。每个Tomcat服务器间用集群管理器(SimpleTcpCluster)进行通信,以实现HTTP回话的复制,比如Session。
一、搭建环境
操作系统:CentOS7
Jdk:1.7
Apache:2.4.33
Tomcat:7.0
Jk:1.2.43
二、安装包准备
Cenos镜像文件
jdk-7u80-linux-x64.tar.gz(jdk)
httpd-2.4.33.tar.gz (Apache)
apache-tomcat-7.0.88.tar.gz(Tomcat)
tomcat-connectors-1.2.43-src.tar.gz(Jk)
安装Apache所需要的依赖包:
apr-1.6.3.tar.gz
apr-util-1.6.1.tar.gz
apr-iconv-1.2.2.tar.gz
pcre-8.39.tar.gz
三、集群部署步骤
3.1安装在VMware安装centos7
https://blog.csdn.net/hui_2016/article/details/68927487
3.2 安装配置jdk
1、将centos自带jdk删除
2、将jdk压缩包拷贝到/urs/local下面
3、解压:#tar -zxvf jdk-7u80-linux-x64.tar.gz
4、配置Java环境变量在/etc/profile 末尾
5、把selinux=enforcing改为selinux=disabled 在/etc/selinux/config文件中;
3.3安装Apache步骤
3.3.1安装依赖包
1、下图四个安装包拷贝到/urs/local下面
2、安装apr——执行以下代码
# tar -zxvf apr-1.6.3.tar.gz
# cd apr-1.6.3
# ./configure --prefix=/usr/local/apr
# make
# make install
3、安装apr-util——执行以下代码
注意:apr-util 1.6.0以上的版本需要 expat 的支持,下载安装expat步骤如下:
# wget https://sourceforge.net/projects/expat/files/expat/2.2.3/expat-2.2.3.tar.bz2
#tar -xjvf expat-2.2.3.tar.bz2
#./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-expat=/usr/local/expat
# make && make install
以上是apr-util 1.6.0所需要的步骤不然会报错,接下来是apr-util的安装
# tar -zxvf apr-util-1.6.1.tar.gz
# cd apr-util-1.6.1
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-expat=/usr/local/expat
# make
# make install
4、安装pcre——执行以下代码
# tar -zxvf pcre-8.32.tar.gz
# cd pcre-8.39
# ./configure --prefix=/usr/local/pcre
# make
# make install
3.3.2安装Apache
1、将httpd-2.4.33.tar.gz拷贝到/urs/local下
2、#cd /usr/local
3、 #tar -zxvf httpd-2.4.33.tar.gz
4、#cd httpd-2.4.33
5、./configure --prefix=/usr/local/apache --enable-so -enable-proxy -enable-proxy_http=shared --enable-module=so --enable-mods-shared=all --enable-proxy-ajp=shared --enable-proxy-balancer -with-mpm=worker --with-apr=/usr/local/apr/ --with-apr-util=/usr/local/apr-util/ --with-pcre=/usr/local/pcre
[注意空格]
6、#make && make install
3.3.3 Apache 的配置及测试
1、# vim /apache/conf /httpd.conf
2、在文件中打开注释ServerName,将ServerName值改为对应的IP地址,如下图所示
3、文件中的DirectoryIndex中添加 index.jsp,如下图所示
4、文件中以下2个注释去掉:
#Include conf/extra/httpd-mpm.conf
#Include conf/extra/httpd-default.conf
5、保存修改退出
6、# cd /urs/local/apache/bin
7、#./apachectl start
8、查看进程服务:# ps -ef | grep httpd 显示如下结果则说明已经情动服务
9、打开浏览器访问 输入地址:http://127.0.0.1 如下界面,说明Apache安装成功
3.4安装Tomcat步骤
1、将apache-tomcat-7.0.88.tar.gz拷贝到/urs/local 下面,解压
#tar -zxvf apache-tomcat-7.0.88.tar.gz
2、将解压后的文件夹重命名为tomcat1,复制一份为tomcat2,方便区分,可利用xftp远程连接工具进行该步骤。
3、Server.xml具体修改3.6节会详细讲解
3.5安装jk
1、将安装包tomcat-connectors-1.2.43-src.tar.gz(Jk)目录拷贝到
/usr/local目录下
2、#cd /usr/local
3、# tar -zxvf tomcat-connectors-1.2.43-src.tar.gz
4、编译安装mod_jk。
#cd /tomcat-connectors-1. 2.43-src/native
# chmod 755buildconf.sh
# ./buildconf.sh
# ./configure --with-apxs=/usr/local/apache/bin/apxs
# make
# make install
5、将/tomcat-connectors-1.2.53/apache-2.0下的mod_jk.so文件拷贝到apache安装目录下的modules文件夹下面。
3.6整合Apache+Tomcat+jk
3.6.1修改Tomcat 的server.xml
1、# cd /usr/local/tomcat1/conf
2、# vim server.xml
3、修改<Engine>的配置,打开<Cluster>标签,保存退出
4、#vim /usr/local/tomcat2/conf/server.xml 【修改tomcat2的server.xml】
5、修改对应的端口号,以防端口产生冲突
①默认8005
②默认8080
③默认8009
6、修改<Engine>的配置,打开<Cluster>标签,保存退出
3.6.2 Apache配置——修改 httpd.conf
1、# vim/urs/local/apache/conf/httpd.xml
2、在文件最后添加一下内容:
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
#日志文件
JkLogFile logs/mod_jk.log
#tomcat运行模式
JkLogLevel debug
#收到.jsp结尾的文件交给负载均衡器处理,可自行配置
JkMount /*.jsp loadbalancer
3.6.3 Apache配置——创建workers.properties
1、# touch /urs/local/apache/conf/workers.properties
2、# vim workers.properties
3、workers.properties具体配置如下:
# workers 列表
worker.list=tomcat1,tomcat2, loadbalancer, status
# 第一个tomcat1
worker.tomcat1.port=8009 #对应tomcat的server.xml中配置的ajp13端口号
worker.tomcat1.host=127.0.0.1 #tomcat1的主机IP地址,如不为本机,请填写IP地址
worker.tomcat1.type=ajp13 #定向包协议
worker.tomcat1.lbfactor=1 #server的负载分配权重,值越高,分得的请求越多
#以下为非必要配置,这部分配置tomcat2的配置同tomcat1
#worker.tomcat1.cachesize=1000 #配置tomcat的jk连接缓存大小 (非必要)
#worker.tomcat1.cachesize_timeout=600 # (非必要)
#worker.tomcat1.reclycle_timeout=300 # (非必要)
#worker.tomcat1.socket_keepalive=1 #防止防火墙切断未激活的网络连接(非必要)
#worker.tomcat1.socket_timeout=300 #(非必要)
#worker.tomcat1.local_worker=1 # (非必要)
#worker.tomcat1.retries=3 # (非必要)
# tomcat2
worker.tomcat2.port=9009
worker.tomcat2.host=172.**.***.202 #tomcat2的主机IP地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
# load balancerworker -负载均衡控制器
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat1,tomcat2 #指定分担请求的tomcat
worker.loadbalancer.sticky_session=1 #设置为粘性session
worker.loadbalancer.sticky_session_force=0 #设置当多次请求未响应,请求将转发
worker.status.type=status
注意:
与servel.xml 中的jvmRoute一致
3.6.4 Web项目创建
1、新建web项目
2、index测试代码
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
// 如果有新的 Session 属性设置
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.println("<b>Session 列表</b><br>");
System.out.println("============================");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
%>
<forma"method="POST">
名称:<input type=textsize=20 name="dataName">
<br>
值:<inpu ttype=textsize=20 name="dataValue">
<br>
</form>
</body>
</html>
3、修改web.xml 文件
在<web-app>标签里添加<distributable/>,确保session能够复制
4、将项目打成war包,放到tomcat1和tomcat2的webapps下面
四、测试
1、将Apache和Tomcat依次启动
2、访问http://127.0.0.1/项目名/index.jsp
测试结果:
Worker.properties中 .sticky_session=1 设置为有粘性,一个用户在一个Tomcat中建立了会话后则此后这个用户的所有操做都由这个Tomcat服务器承担,所以访问一直出现的是tomcat1当tomcat1关闭时,会由tomcat2承担,但是sessionID不改变。
ID C3253704969A27AE48AD5EFDE4285708.tomcat1
ID C3253704969A27AE48AD5EFDE4285708.tomcat2
参考:
https://jingyan.baidu.com/article/ab0b5630b632dbc15afa7dc4.html
https://blog.csdn.net/h12kjgj/article/details/73421570
https://blog.csdn.net/guoyf123321/article/details/50724746【web项目参考】
五、知识点延伸
workers.properties配置 详解
1、worker常见属性
ajp13:此类型表示当前worker为一个运行着的Tomcat实例。
Lb :lb即load balancing,专用于负载均衡场景中的woker;此worker并不真正负责处理用户请求,而是将用户请求调度给其它类型为ajp13的worker。
Status :用户显示分布式环境中各实际worker工作状态的特殊worker,它不处理任何请求,也不关联到任何实际工作的worker实例。具体示例如请参见后文中的配置。
Host :Tomcat 7的worker实例所在的主机
Port :Tomcat 7实例上AJP1.3连接器的端口
connection_pool_minsize :最少要保存在连接池中的连接的个数;默认为pool_size/2
connection_pool_timeout:连接池中连接的超时时长
Mount :由当前worker提供的context路径,如果有多个则使用空格格开;此属性可以由JkMount指令替代
retries :错误发生时的重试次数
socket_timeout :mod_jk等待worker响应的时长,默认为0,即无限等待
socket_keepalive :是否启用keep alive的功能,1表示启用,0表示禁用
Lbfactor :worker的权重,可以在负载均衡的应用场景中为worker定义此属性
method :可以设定为R、T或B;默认为R,即根据请求的个数进行调度;T表示根据已经发送给worker的实际流量大小进行调度;B表示根据实际负载情况进行调度。
sticky_session :在将某请求调度至某worker后,源于此址的所有后续请求都将直接调度至此worker,实现将用户session与某worker绑定。默认为值为1,即启用此功能。如果后端的各worker之间支持session复制,则可以将此属性值设为0。
https://www.cnblogs.com/wala-wo/p/5119225.html【参数详细讲解】
文章可能存在不足的地方,仅供参考。