反向代理负载均衡 (Apache+JK+Tomcat) 
使用代理服务器可以将请求转发给内部的Web服务器,让代理服务器将请求均匀地转发给多台内部Web服务器之一上,从而达到负载均衡的目的。这种代理方式与普通的代理方式有所不同,标准代理方式是客户使用代理访问多个外部Web服务器,而这种代理方式是多个客户使用它访问内部Web服务器,因此也被称为反向代理模式。

为什么要配置Tomcat 负载均衡和集群:

负载均衡:负载均衡能处理高并发量的请求。

Tomcat 集群:Tomcat 集群配合负载均衡可以是系统达到高可用性,即任何一台服务器不可用,自动重新连接后,能保持session 数据一致,不需要重新输入密码。

简单原理介绍:

1.apatche 与tomcat 的之间的联系由jk 完成,用的是ajp协议。每个tomcat 都在监听ajp端口。默认的 AJP Connector 的端口是 8009 。

2.配置了集群的 tomcat 之间通过 tcp 协议通信复制 session,当然要在tomcat 应用中的web.xml 文件中加入<distributable/>或<Context distributable="true" /> ,标志着要复制session。 
复制session 是为了在某个服务器正在被请求时宕机,请求由apache 通过jk 转发到其他tomcat 服务器时,session 中的信息丢失采取的一中保持session 的方式,还有其他的解决方案,如把session 存到数据库中。 
3.jk 把请求分配给某个tomcat 服务器遵循着不同的原则,这里我们使用的是负载均衡。在 workers.properties 中定义了很多worker ,如果worker 的type 把定义成 lb,就表示这个worker 是负载均衡worker ,他知道怎样提供轮询来分配request 。而负载均衡也分很多平衡的方式,采用哪种方式决定于属性worker.balancer.method ;下面具体描述不同的负载均衡方 
式 (默认的是R 方式)。 
worker.balancer.method=Request (简写R ):负载均衡worker 将根据每个tomcat 服务器上处理的request 数来寻找最佳的tomcat 服务器。这种方式适合绝大数application 。 
worker.balancer.method=Session (简写 S ):负载均衡worker 根据各个tomcat 上 session的数量来寻找最佳tomcat ,但是负载均衡worker 并没有状态,所以不知道session 个数,所以把没有session cookie 的请求或url 中没有encode sessionid 的请求当作new session 。 
worker.balancer.method= Traffic (简写T ):负载均衡worker 根据jk 和tomcat 直接的网络状况来找最佳的tomcat 服务器。 
worker.balancer.method= Busyness (简写B ):负载均衡worker 根据tomcat 的流量选择流量最少的tomcat 。

1.下载安装

Apache服务器:是前端web 服务器,用来接收客户端的请求。下载地址是http://httpd.apache.org/ (Windows版:httpd-2.2.22-win32-x86-no_ssl.msi)

mod_jk.so:是tomcat Connector ,用于把apache 接收到的请求分发给tomcat 来处理。下载地址是http://www.fayea.com/apache-mirror//tomcat/tomcat-connectors/jk/binaries/windows/ JK要与Apache版本对应。JK 分为两个版本 1,x 和 2.x ,其中 2.x 并不是最新的版本,它是 JK 的另外一个分支,后不知何因没有继续开发,因此2.x 版本已经废弃。

Tomcat :也是web 服务器,但在这里主要充当servlet 容器,用来处理jk 转发过来的请求。下载地址是http://tomcat.apache.org/

安装 apache ,并把 mod_jk.2.0.55 解压后拷贝到 apache 安装目录(Apache_HOME)/modules 下面,其实modules 下面是apache 的各个功能模块,可插拔。
安装各个tomcat 到不同的主机上。

2、配置Apache_Home\conf\httpd.conf

在httpd.conf文件的最后一行写入

include "C:\Program Files\Apache Software Foundation\Apache2.2\conf\mod_jk.conf"

3、配置mod_jk.conf文件

在Apache_Home\conf下建立mod_jk.conf文件。配置内容:

#加载mod_jk Module
LoadModule jk_module modules/mod_jk.so
# 配置 mod_jk
#加载集群中的workers
JkWorkersFile conf/workers.properties
#加载workers的请求处理分配文件
JkMountFile conf/uriworkermap.properties
#指定jk的日志输出文件
JkLogFile logs/mod_jk.log
#指定日志级别
JkLogLevel warn
#指定哪些请求交给tomcat处理,"controller"为在 workers.propertise里指定的负载分配控制器名
JkMount /*.* controller

4、配置workers.propertise文件

在Apache_Home\conf下建立workers.propertise文件。

#server 列表
worker.list=controller,tomcat1,tomcat2
#========tomcat1========
worker.tomcat1.port=8008 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1 #server的加权比重,值越高,分得的请求越多
#========tomcat2========
worker.tomcat2.port=8009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat2.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1 #server的加权比重,值越高,分得的请求越多
#========controller,负载均衡控制器========
worker.controller.type=lb #server名为controller,用于负载均衡
worker.retries=3 #重试次数
worker.controller.balance_workers=tomcat1,tomcat2
#粘性Session(默认是打开的) 当该属性值=True(或1)时,代表Session是粘性的,即同一Session在集群中的同一个节点上处理,Session不跨越节点。在集群环境中,一般将该值设置为False
worker.controller.sticky_session=false
#设置用于负载均衡的server的session可否共享 有不少文章说设置为1是可以的,也有设置为0才可以的
#worker.controller.sticky_session=1
#worker.controller.sticky_session_force=1
#worker.status.type=status

5、配置uriworkermap.properties文件

在Apache_Home\conf下建立uriworkermap.properties文件

#所有请求都由controller这个server处理
/*=controller
#所有包含jkstatus请求的都由status这个 server处理
#/jkstatus=status
#这里的"!”是“非”的意思。
!/*.gif=controller
!/*.jpg=controller
!/*.png=controller
!/*.css=controller
!/*.js=controller
!/*.htm=controller
!/*.html=controller

6、修改tomcat1_Home\conf\server.xml配置

Starting Coyote HTTP/1.1 on http-8081 默认端口为8080,修改为8081。

<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

JK: ajp13 listening on /0.0.0.0:8009 修改端口必须与workers.propertise文件内worker.tomcat1.port=8009一致。

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

以上为负载均衡配置完毕!接下来可以配置Tomcat集群和Session复制!

需要添加的内容(这些代码在XML中都被注释掉了,把注释去掉,然后编辑即可):

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2"><!--tomcat1将与tomcat2黏贴session 在这里指定黏贴对象-->
...
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true" /> <Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000" />
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6" /> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor" />
</Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="" />
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve" /> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false" /> <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener" />
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />
</Cluster>
...
</Engine>

Tomcat2的server.xml配置也做相应修改,因为本文测试使用同一台电脑,所以对应的微做修改端口。Tomcat分布于不同电脑上,不用改端口号。

...
<Connector port="8082" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
...
<Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />
...
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"><!--tomcat2将与tomcat1黏贴session 在这里指定黏贴对象-->
...
  <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4001"
autoBind="100"
selectorTimeout="5000"
maxThreads="6" />

7、最后要tomcat支持session复制,必须在web.xml里面加上一个标签。

<!-- 集群 表明要复制session,一般放在最后-->
<distributable/>

注意:session黏贴(共享)方面,如果session中存放的为javabean,javabean必须实现Serializable接口,如果没有实现会报错误 Exception thrown: class java.lang.IllegalArgumentException。

8、测试

在tomcat2\webapps下建立test文件夹,建立test.jsp文件

<%System.out.println("==============");%>

启动Tomcat1、Tomcat2、Apache。浏览器中输入:http://localhost/test/test.jsp。不停刷新浏览器,可以在Tomcat1和2的控制台看到=====交替输出。

结果:在不同的客户端发起请求,请求会被平均分配给tomcat。关闭其中一个tomcat 1,tomcat 1 原来处理的请求会被其他tomcat2 接收,如果此前被关闭的tomca 1t 的session 中存在信息, tomcat2 中tomcat1 的session 信息依然存在,表现为登录——tomcat 宕机——请求被转到另外一个tomcat ,并仍然处于登录状态。

详细配置附录

不同类型的worker,worker.controller.type配置:

ajp12 这种类型的worker 知道使用ajp12 协议把请求转向tomcat,最终它将被jk 使用,用来与tomcat 服务器交互。
ajp13 这种类型的worker 知道使用ajp13 协议把请求转向tomcat,最终它将被jk 使用,用来与tomcat 服务器交互。
jni 这种类型的worker 知道使用jni 协议把请求转向tomcat,最终它将被jk 使用,用来与tomcat 服务器交互。
lb 这种类型的worker 是负载均衡worker,他知道怎样提供轮询来分配请求。(常用)
status 这种类型的worker 负责管理负载均衡。

基于Apache的Tomcat负载均衡和集群(2)的更多相关文章

  1. 基于apache的tomcat负载均衡和集群配置

    最近不是很忙,用零碎时间做点小小的实验. 以前公司采用F5负载均衡交换机,F5将请求转发给多台服务器,每台服务器有多个webserver实例,每个webserver分布在多台服务器,交叉式的分布集群. ...

  2. 基于apache的tomcat负载均衡和集群配置session共享

    接上面的话题接着继续完善.为什么没接到上篇呢?原因很简单太长的文章不爱看!就像有人写了上千行的方法一样,不是逼得没办法谁爱看谁看,反正我不看. 期间我没有一次配置成功,从失败的开始说起, 1.准备ja ...

  3. 基于nginx的tomcat负载均衡和集群

    要集群tomcat主要是解决SESSION共享的问题,因此我利用memcached来保存session,多台TOMCAT服务器即可共享SESSION了. 你可以自己写tomcat的扩展来保存SESSI ...

  4. apache的tomcat负载均衡和集群配置 "

    略看了一下,感觉太复杂,要配置的东西太多,因此在这里写出一种更简洁的方法. 要集群tomcat主要是解决SESSION共享的问题,因此我利用memcached来保存session,多台TOMCAT服务 ...

  5. Apache、Tomcat负载均衡与集群

    一. 环境准备 1.软件下载 a) apache_2.0.55-win32-x86-no_ssl.msi: b) apache-tomcat-5.5.17.rar c) mod_jk-apache-2 ...

  6. Tomcat负载均衡和集群环境的搭建

    实现此集群的方法参考了网上的很多文章,但由于很多文章都表明是原创的,故无法知道整个操作流程的真正作者是谁.下面就是我用我们真实的项目去实现这个过程.同时修复这过程中一些问题.以下的所有步骤均为亲自测试 ...

  7. 使用apache和nginx代理实现tomcat负载均衡及集群配置详解

    实验环境: 1.nginx的代理功能 nginx proxy: eth0: 192.168.8.48 vmnet2 eth1: 192.168.10.10 tomcat server1: vmnet2 ...

  8. apache + tomcat 负载均衡分布式集群配置

    Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问 ...

  9. linux下一个apache+tomcat负载均衡和集群

    先说一下我的环境 一个ubuntu虚拟机, 一个apache2.2示例 两tomcat1.7示例 1.安装apacheserver sudo apt-get install apache2 假设要重新 ...

随机推荐

  1. hive 之 查看某库一共有多少张表

    思路一: show出所有表,然后wc -l hive -e" use database_name; show tables; "|wc -l 思路二: 1.show出当前库所有的表 ...

  2. store在模块化后,获取state中的值时undefined

    目录结构 用this.$store.getters.showNotif ,加上模块名this.$store.getters.apply.showNotif都取不到值, 控制台打印store,发现这样的 ...

  3. dnspython模块报错 AttributeError: 'CNAME' object has no attribute 'address'

    有时候用到这个模块的时候会报错 AttributeError: 'CNAME' object has no attribute 'address' 如下所示 [root@ansible ch01]# ...

  4. [转]浮点运算decimal.js

    开发过程中免不了有浮点运算,JavaScript浮点运算的精度问题会带来一些困扰 JavaScript 只有一种数字类型 ( Number ) JavaScript采用 IEEE 754 标准双精度浮 ...

  5. 使用.NET 6开发TodoList应用(27)——实现API的Swagger文档化

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在日常开发中,我们需要给前端提供文档化的API接口定义,甚至需要模拟架设一个fake服务用来调试接口字段.或者对于后端开发人员 ...

  6. go包管理速通,一篇文章就够了,再也不用担心因为不会导包被辞退

    前言 最近在看一些go语言相关的书,发现了一个有意思的事情:其中一本书最新印刷的版本是2017年3月,而golang包管理的后起之秀go module伴随go1.11于2018年8月诞生--因此,书里 ...

  7. 《剑指offer》面试题40. 最小的k个数

    问题描述 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:arr = [3,2,1], k ...

  8. spring 事务失效的几种场景

    以下场景是基于mysql数据库,InnoDB的存储引擎. 一.没有添加@Transactional注解 二.方法声明是private或者static 三.没有抛出异常而是try catch了异常 下面 ...

  9. 【刷题-LeetCode】164 Maximum Gap

    Maximum Gap Given an unsorted array, find the maximum difference between the successive elements in ...

  10. golang gin框架中实现一个简单的不是特别精确的秒级限流器

    起因 看了两篇关于golang中限流器的帖子: Gin 开发实践:如何实现限流中间件 常用限流策略--漏桶与令牌桶介绍 我照着用,居然没效果-- 时间有限没有深究.这实在是一个很简单的功能,我的需求是 ...