Apache+JK+Tomcat 负载平衡配置
网 上关于 Apache + JK + Tomcat 的集群配置例子很多,按着例子配置下来,基本都能运行,不过,在一些重要的地方却没有进一步的说明。这次公司一个产品就是采用Apache+JK+Tomcat 集群,在整个配置、测试过程中,遇到了许多的问题,经过不断测试、摸索,最后总算是搞定了,性能也达到了预期的目标。针 对网上的例子,感觉有必要再详细的介绍一下我的配置过程,对一些要特别注意的地方进行补充。
集群有别于分布式的解决方案,它采用的是每台服务器运行相同应用的策略,由负责平衡的服务器进行分流,这对提高整个系统的并发量及吞吐量是更有效的 办法。而集群对请求的处理又有两种不同的方式:负载平衡、状态复制 ( 即集群 ) ,状态复制需要在各服务器间复制应用状态,而负载平衡则不用,每台服务器都是 独立的。实践证明,在各应用服务器之间不需要状态复制的情况下,负载平衡可以达到性能的线性增长及更高的并发需求。
对于集群的其它基础知识,在此就不再做累赘。以下就这次 Apache + JK + Tomcat 的负载平衡配置进行总结,重点关注整个配置及注意事项。
准备软件
1 、 Tomcat 或 JBoss (本文档中采用的是 JBoss4.0.2 );
2 、 apache2.0.54 是开源的 Web 服务器,下载地址为: http://www.apache.org/dist/httpd/binaries/ ;
3 、 mod_jk-1.2.14-apache-2.0.54.so 模块 ,jk 是 mod_jserv 的替代者,它是 Tomcat-Apache 插件,为 Apache 和 Tomcat 的连接器,处理 Tomcat 和 Apache 之间的通信,在集群配置中充当负载均衡器的作用,当前的最新版本为 1.2.15 ,不 过不同 JK版本与不同的 Apache 版本之间的搭配有一些差异,有的甚至配不起来。 JK2 是符合 apache2.x 系列的新品,但由于其配置太过麻烦,使 用的人很少,所以目前已停止开发,所以我们采用了 jk 连接器,下载地址:http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/ 。
集群与负载平衡
使用 mod_jk 默认的以轮循方式进行平衡负载,假设有四个服务器节点,有 10 个请求,则四个节点分别接受请求编号如下:
节点 1 节点 2 节点 3 节点 4
1 2 3 45 6 7 89 10
而集群方式也是使用这种方法进行平衡。 Tomcat 中的集群原理是通过组播的方式进行节点的查找并使用 TCP 连接进行会话的复制。
集群不同于负载平衡的是,由于集群服务需要在处理请求之间不断地进行会话复制,复制后的会话将会慢慢变得庞大,因此它的资源占用率是非常高的,如果在并发量大的应用中,复制的会话大小会变得相当大,而使用的总内存更是会迅速升高。
但集群的会话复制,增加了系统的高可用性。由于在每台服务器都保存有用户的 Session 信息,如果服务器群中某台当机,应用可以自动切换到其它服务器上继续运行,而用户的信息不会丢失,这提高了应用的冗错性。
具体采用负载平衡还是集群,这要看应用的需求了。
安装配置 Apache
1 、下载 Apache 的安装程序 apache_2.0.54-win32-x86-no_ssl.exe 后,安装很简单,一路回车,就此略过。
2 、安装完毕后,将下载的 mod_jk-1.2.14-apache-2.0.54.so 复制到 Apache 安装目录下的 modules 子目录中。
3 、然后进入 Apache 安装目录下的 conf 子目录中,打开 httpd.conf 配置文件,在最后插入以下一行:
Include conf/mod_jk.conf
4 、 在 conf 子目录下,建立一个新的配置文件: mod_jk.conf ,此文件为 Apache 加载连接器的配置文件,文件名可修改,但要与 httpd.conf 中 Include 的文件名一致,内容如下:
# Load mod_jk module. Specify the filename
# of the mod_jk lib you’ve downloaded and
# installed in the previous section
# 加载 mod_jk 模块
LoadModule jk_module modules/mod_jk-1.2.14-apache-2.0.54.so
# Where to find workers.properties
JkWorkersFile conf/workers2.properties
# Where to put jk logs
JkLogFile logs/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
# 请求分发配置,可以配置多项
JkMount /* loadbalancer
# 关掉主机 Lookup ,如果为 on ,很影响性能,可以有 10 多秒钟的延迟。
HostnameLookups Off
注:蓝色加粗的两行是重点,第一句是 Apache 加载 JK 模块用的;第二句为配置哪些 URL 请求将由负载平衡器来处理。
5 、 在 conf 子目录下,建立一个新的配置文件: workers2.properties ,此文件为负载平衡的配置文件,文件名不能修改,这是 JK 默认的名字,内容如下:
worker.list=loadbalancer
# Define the first node...
worker.server99.port=8009
worker.server99.host=192.168.11.99
worker.server99.type=ajp13
worker.server99.lbfactor=1
worker.server99.local_worker=1
worker.server99.cachesize=1000
worker.server99.cache_timeout=600
worker.server99.socket_keepalive=1
worker.server99.socket_timeout=0
worker.server99.reclycle_timeout=300
worker.server99.retries=3
# Define the second node...
worker.server202.port=8009
worker.server202.host=192.168.11.202
worker.server202.type=ajp13
worker.server202.lbfactor=1
worker.server202.local_worker=1
worker.server202.cachesize=1000
worker.server202.cache_timeout=600
worker.server202.socket_keepalive=1
worker.server202.socket_timeout=0
worker.server202.reclycle_timeout=300
worker.server202.retries=3
# Now we define the load-balancing behaviour
worker.loadbalancer.type=lb
worker.retries=3
worker.loadbalancer.balance_workers=server99 ,server202
worker.loadbalancer.sticky_session=true
worker.loadbalancer.sticky_session_force=true
注:以上定义了两个 worker ,一个为 server99 ,另一个为 server202 ,定义了一个负载平衡服务器 loadbalancer ,其中标蓝色的为重点配置项,相关的详细说明可以看官方的网站文档: http://tomcat.apache.org/connectors-doc/ ,其它节点的定义可以直接 Copy ,修改一下节点名及 IP 就好了。
A 、 worker.list=loadbalancer
设定工作的负载平衡器,各 Tomcat 节点不能加入此列表。
B 、 worker.server99.lbfactor
负载平衡的权重比,如果此权重比越大,则分配到此节点的请求越多,如以上两个节点的权重比为 1:1 ,则为平均分配。
C 、 worker.loadbalancer.balance_workers=server99,server202
指定此负载平衡器负责的 Tomcat 应用节点。
D 、 worker.loadbalancer.sticky_session=true
此处指定集群是否需要会话复制,如果设为 true ,则表明为会话粘性,不进行会话复制,当某用户的请求第一次分发到哪台Tomcat 后,后继的请求会一直分发到此 Tomcat 服务器上处理;如果设为 false ,则表明需求会话复制。
E 、 worker.loadbalancer.sticky_session_force=true
如果上面的 sticky_session 设为 true 时,建议此处也设为 true ,此参数表明如果集群中某台 Tomcat 服务器在多次请求没有响应后,是 否将当前的请求,转发到其它 Tomcat 服务器上处理;此参数在 sticky_session=true 时,影响比较大,会导致转发到其它 Tomcat 服 务器上的请求,找不到原来的 session ,所以如果此时请求中有读取 session 中某些信息的话,就会导致应用的 null 异常。
6 、 Apache 服务器的配置文件 httpd.conf 中,默认有三个参数对性能的影响比较大,但根据不同的性能要求,参数的表现又不一样,太小并发提不上去,太大性能反而不好,建议根据项目的需要,实际做个测试,如并发要求 800 的话,可以设定为:
# 一个连接的最大请求数量
MaxKeepAliveRequests 1000 (值为 0 ,则不限制数量)
# 每个进程的线程数,最大 1920 。 NT 只启动父子两个进程,不能设置启动多个进程
ThreadsPerChild 1000 (最大为 1920 )
# 每个子进程能够处理的最大请求数
MaxRequestsPerChild 1000 (值为 0 ,则不限制数量)
这三个参数要根据不同的需求,不同的服务器进行调整。
安装配置 Tomcat 或 JBoss
1 、对于 Tomcat 或 JBoss 的安装,这里不做说明,目前我们是采用 Apache+JBoss ,不过, JBoss 也是用的 Tomcat ,所以这里的配置也是适合 Tomcat 的;
2 、对于 JBoss 的配置,很简单,只需要改两个地方就可以了:
第一个地方:进入 jboss-4.0.2\server\default\deploy\jbossweb-tomcat55.sar ,打开 server.xml ,大约在第 32 行左右,有,在其中加入一个参数,变为:
第二个地方:进入 jboss-4.0.2\server\default\deploy\jbossweb-tomcat55.sar\META-INF 目录,打开 jboss-service.xml ,大约在110 行,有 false ,将其改为:
true
这里有一个需要特别注意的地方, JBoss 的 Tomcat 中,关于 AJP 连接协议的默认配置,对于大并发量是不够用的,要做一些修改,进入 jboss-4.0.2\server\default\deploy\jbossweb-tomcat55.sar ,打开 server.xml ,找到的 地方,这里是定义 AJP 连接器的地方,它的配置中没有 maxThreads 项,默认为 200 ,我们可以做修
emptySessionPath="true" enableLookups="false" redirectPort="8443"
protocol="AJP/1.3" maxThreads="3000"/>
maxThreads 的值要看你的并发量多大,设置太大也不好。
运行
至此,整个配置全部完成,注意一点是,在各 JBoss 节点,重启或新增加一个 JBoss 节点时,需要重新启动 Apache ,而对于服务器群中某个 JBoss 节点 shutdown , Apache 会自动侦测,不用重新启动。
如果在运行过程中,群中的某个 JBoss 节点 shutdown ,则已登录到此服务器上的用户的请求将出错,此服务器负责的 session将丢失,但 Apache 会自动侦测到此服务器已 shutdown ,后继的新请求将不会再引导到此节点。
对于负责请求分发的 Apache 服务器,需要消耗大量的 CPU 资源,因此如果在测试过程中出现一些 Service Temporarily Unavailable 或 Server has shut down the connection prematurely 这样的错误,这一般都是服务器配置不够好引起的,或者是Apache 、 Tomcat 、及应用中的某些配置不够使用,这时候就要考虑 换更好的机器或优化应用中的配置。
常见问题
一、 cannot connect to server :无法连接到服务器。这种情况是服务器的配置有问题,服务器无法承受过多的并发连接了,需要优化服务器的配置:
如操作系统采用更高版本,如 windows 2003 server ,
优化 tomcat 配置: maxThreads="500" minSpareThreads="400" maxSpareThreads="450"
但是 tomcat 最多支持 500 个并发访问
优化 apache 配置:
ThreadsPerChild 1900
MaxRequestsPerChild 10000
二、 Action.c(10): Error -27791: Server has shut down the connection prematurely
HTTP Status-Code=503 (Service Temporarily Unavailable)
一般都是由于服务器配置不够好引起的,需要优化硬件和调整程序了。
三、无法处理请求:
当我们输入 ***.do 命令后, apache 却返回错误信息,而连接 tomcat 却没有问题。原因是没有把 .do 命令转发给 tomcat 处理。解决方法如下:
在 apache 配置文件中配置如下内容:
JkMount /*.jsp loadbalancer
JkMount /*.do loadbalancer
Apache+JK+Tomcat 负载平衡配置的更多相关文章
- apache与tomcat负载集群集成方法配置
apache与tomcat负载集群集成方法有3种jk.jk_proxy.http_proxy apache:httpd-2.2.17-win32-x86-no_ssl.msi tomcat:apach ...
- 基于Apache的Tomcat负载均衡和集群(2)
反向代理负载均衡 (Apache+JK+Tomcat) 使用代理服务器可以将请求转发给内部的Web服务器,让代理服务器将请求均匀地转发给多台内部Web服务器之一上,从而达到负载均衡的目的.这种代理方式 ...
- apache与tomcat负载集群的3种方法
花了两天时间学习apache与tomcat的集成方法,现在把学习成果记录下来. apache与tomcat负载集群集成方法有3种jk.jk_proxy.http_proxy 本次集成使用的软件版本: ...
- window xp Apache与Tomcat集群配置--转载
转载地址:http://www.cnblogs.com/obullxl/archive/2011/06/09/apache-tomcat-cluster-config.html 一. 环境说明 Win ...
- Nginx + Tomcat 负载均衡配置详解
Nginx常用操作指南一.Nginx 与 Tomcat 安装.配置及优化1. 检查和安装依赖项 yum -y install gcc pcre pcre-devel zlib zlib-devel o ...
- 基于apache的tomcat负载均衡和集群配置
最近不是很忙,用零碎时间做点小小的实验. 以前公司采用F5负载均衡交换机,F5将请求转发给多台服务器,每台服务器有多个webserver实例,每个webserver分布在多台服务器,交叉式的分布集群. ...
- apache的tomcat负载均衡和集群配置 "
略看了一下,感觉太复杂,要配置的东西太多,因此在这里写出一种更简洁的方法. 要集群tomcat主要是解决SESSION共享的问题,因此我利用memcached来保存session,多台TOMCAT服务 ...
- Apache与Tomcat整合的配置
下载jk连接器地址:http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/windows/ 把jk连接器即“mod_j ...
- Tomcat负载均衡配置-未完成
集群技术是目前非常流行的提高系统服务能力与高可靠性( HA- High Availability )的手段,通过把多个独立的服务器组成一个集群可以实现失效无缝转移.也就是说当有某一台集群中的服务器当机 ...
- Apache与Tomcat负载均衡
Apache HTTP Server 与 Tomcat 的三种连接方式JK,http_proxy,ajp_proxy.下面逐个介绍一下(本篇介绍的示例都是基于前面介绍的已经搭建好的Tomcat集群,都 ...
随机推荐
- JVM笔记二双亲委派机制
JVM笔记二双亲委派机制 JVM双亲委派机制,简单来说:我爸是李刚,有事找我爸.用三个字来说:往上捅.不信?咱们一起看看. JVM的双亲委派机制 JVM类加载器是什么机制?为什么使用这种机制(这种 ...
- IDEA 忽然无法打开某个特定文件
背景:IDEA中双击打开一个.py文件时,弹出一个文件类型的弹窗(没注意是什么,估计是不小心按到了什么快捷键),当时随便选的Text,结果不知道为什么,这个文件无法在IDEA中打开(之前都正常) 由于 ...
- 这应该是全网最详细的Vue3.5版本解读
前言 Vue3.5正式版在这两天发布了,网上已经有了不少关于Vue3.5版本的解读文章.但是欧阳发现这些文章对3.5中新增的功能介绍都不是很全,所以导致不少同学有个错觉,觉得Vue3.5版本不过如此, ...
- c++ 命名的强制类型转换
显式转换:显式将一种类型转换为另一种类型. References: C++中的显示数据类型转换 与命名的强制类型转换相比,旧式的强制类型转换从表现形式上来说不那么清晰明了,容易被看漏,所以一旦转换过程 ...
- CSS & JS Effect – Breadcrumb Navigation 面包屑
介绍 Breadcrumb 长这样 主要就是让用户清楚自己在哪个 page, 然后可以轻松返回上一页. Step by Step HTML <div class="container& ...
- CSS – W3Schools 学习笔记 (3)
CSS Rounded Corners Link to W3Schools 它是用来画圆角的, 假设有 1 给正方形, 100px. border-top-left-radius: 30px; bef ...
- CSP2024-S 游记
9-21 今天考完了初赛,明显感觉数学门槛变高了一些,有高中数学知识才能保证看得懂题意,只是苦了小学和初中同学,看数据参加人数还涨了50%,权当拉低分数线了吧.用小图灵估分70.应该是稳过.
- 浏览器中生成 OSS 令牌 | Web Crypto API
笔者写文章的时候,都会把图片通过自己搭建的一个简单站点 https://imgbed.sugarat.top/ 把图片上传到各种云的对象存储服务(OSS)上. 然后通过CDN访问,保证图片有可靠的访问 ...
- [摘录] WebView2 与 JS 交互
https://docs.microsoft.com/zh-cn/microsoft-edge/webview2/gettingstarted/win32 步骤 5-脚本 托管应用还可以将 JavaS ...
- perf时 出现[kernel.kallsyms] 符号怎么办
在 perf 工具生成的火焰图中看到 [kernel.kallsyms],通常意味着火焰图中包含内核符号,但这些符号没有被正确解析.这可能是由于以下几个原因导致的: 内核符号表不可用或不完整:perf ...