知识大全 apache+Tomcat负载平衡设置详解
Posted 属性
篇首语:最关情,折尽梅花,难寄相思。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 apache+Tomcat负载平衡设置详解相关的知识,希望对你有一定的参考价值。
apache+Tomcat负载平衡设置详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
一 简介
每个Tomcat worker是一个服务于web server 等待执行servlet的Tomcat实例 例如我们经常使用像Apache之类的web server转发sevlet请求给位于其后面的一个Tomcat进程(也就是前面所说的worker) 本文详细介绍了如何配置各种类型worker和 loadbalance 并说明了各种类型worker的特性和loadbalance配置的原理
二 为什么使用Tomcat workers
上文描述了一个非常简单的结构 事实上能够配置多个Tomcat workers来处理web server转发的servlet请求 而这样配置的理由不外乎以下几种假想环境
* 我们在开发环境中发布不同的Tomcat workers为各自不同的应用服务 当然在开发环境中的开发者共享同一个web server 但是每个Tomcat worke服务于拥有它的开发者
* 我们在不同的Tomcat进程上定义各自的虚拟主机 这样不同的公司可以使用各自的web site 从而使他们的web site得到了合理的分割
* 我们提供负载平衡的web site 也就意味着同时使用多个Tomcat workers 而每个Tomcat worker具有独立的主机并且在workers之间要分配通过web server转发来的请求
当然 这些假想情况也许并不能涵盖使用多个workers的所有状况
三 workers properties配置说明
定义Tomcat workers的方法是在apache的conf目录下编写一个名为 workers properties 的属性文件 本文将详细解释如何进行配置的
定义Workers列表
定义workers的方法就是在apache的conf目录下编写一个workers properties文件 使其作为apache的插件来发挥作用
定义workers列表的格式
worker list =<使用 分割的worker 名字列表>
例如
worker list= worker worker
当apache启动时 workers properties作为插件将初始化出现在worker list列表中的workers
定义Workers的类型
每个被命名的worker都应有一些关于其自身的附加信息 这些信息包括了worker的类型和其它相关信息 这里讨论的是JK 中定义的workers类型
定义worker类型的格式
worker worker名字 type =<worker类型>
worker名字的命名最好遵循java的命名规范
worker类型取值于下面的表格
定义一个名为 local 的worker 其使用ajpv 协议与Tomcat 进程通讯
worker local type=ajp
定义一个名为 remote 的worker 其使用ajpv 协议与Tomcat 进程通讯
worker remote type=ajp
定义一个名为 fast 的worker 其使用JNI的方式与Tomcat 进程通讯
worker fast type=jni
定义一个名为 loadbalancer 的worker 其作为对多个Tomcat 进程的负载平衡使用
worker loadbalancer type=lb
各个类型具有不同的行为 我们在下文中会详细解释
设置Worker属性
在定义worker之后 还需要提供各个worker的属性 这些属性的定义使用下面的方式
worker <worker名字> <属性>=<属性值>
ajp 类型的Worker属性
ajp 类型的worker工作时使用基于TCP/IP socket的ajpv 协议转发请求给 进程外 Tomcat worker
ajp worker属性如下
host
侦听ajp 请求的Tomcat worker主机
port
Tomcat worker主机的侦听端口
lbfactor
当此Tomcat worker被用于一个负载平衡worker使用时 此属性将被使用 它定义了此worker的负载平衡权值
例如 下面的 worker 定义了一个位于主机上的Tomcat 它使用 端口侦听apache发来的请求 并具有 的负载权值
worker worker host=worker worker port= worker worker lbfactor=
注意 在ajpv 协议中 针对每个请求都要一个连接建立 使用 关闭 其默认侦听端口为
ajp 类型的Worker属性
ajp 类型的worker工作时使用基于TCP/IP socket的ajpv 协议转发请求给 进程外 Tomcat worker
ajpv 协议与ajpv 协议的主要不同
* ajpv 具有更丰富的二进制协议 它使用将频繁使用的字符串编码为小整数的方式对请求数据进行压缩
* ajpv 重用打开的socket并保留这些打开的socket以处理将来的请求 这在apache与Tomcat之间具有防火墙的网络环境下是必要的
* ajpv 具有对SSL信息的处理能力 以致容器能够实现SSL的相关方法(如isSecure())
注意 ajp 当前只能用于支持 进程外 协议的Tomcat x x and
下表描述了ajp worker接受的属性
host
侦听ajp 请求的Tomcat worker主机
port
Tomcat worker主机的侦听端口
lbfactor
当此Tomcat worker被用于一个负载平衡worker使用时 此属性将被使用 它定义了此worker的负载平衡权值
cachesize
当在多线程的web server(例如apache IIS Netscape)中使用JK时 此属性是有效的 如果将cachesize的值设置为较高的值 这些支持多线程的web server将获得很好的处理能力 如果此属性不被设置 则连接cache特性将失效
cache_timeout
本属性用于声明JK在cache中保留一个打开的socket的时间 它对减少web serer的线程数有所帮助
使用cache_timeout的原因
周所周知 一个身背重负的web server(例如apache)建立childs/threads来处理负载 而当负载减少时它将销毁无用的childs/threads 每个 child在转发请求给Tomcat时要打开一个ajp 连接 而在Tomcat那一端也将建立一个ajp 线程与之通讯 但是问题出现在一个 ajp 连接建立完成后 child没有及时的释放那个ajp 连接 由于web server 将保持它的childs/threads运行已处理高负载 即使childs/threads处理快速的静态内容 在Tomcat端也将积累很多的无用ajp 线程
socket_keepalive
当防火墙位于web server与Tomcat之间时 防火墙将尝试断开未激活的网络连接 此属性将告诉操作系统在未激活的连接中发送KEEP_ALIVE信息(发送间隔时间依赖于操作系统的设置 一般为 秒) 这样将防止防火墙切断未激活的网络连接
但此设置并不是万能钥匙 它对于某些防火墙也无能为力
socket_timeout
此属性说明连接在未激活的状况下持续多久 web server将主动切断之 这是一个使Tomcat端的陈旧线程不致过多的好方法 但是也带来了在下一次请求到来时需要重新打开socket的开销 此属性与cache_timeout有类似的功效 但是它工作在non cache模式
connect_timeout
web server在连接建立后将一个PING请求发送到ajp 协议的连接上 此属性说明了web server等待PONG回应的时间(以ms为单位) 此属性在jk 版本被增加进来 以求避免Tomcat的死机 Tomcat + + and +实现了对使用ajp 的 ping/pong的支持 此属性默认为失效的
prepost_timeout
web server在转发一个请求后将一个PING请求发送到ajp 协议的连接上 此属性说明了web server等待PONG回应的时间(以ms为单位) 此属性在jk 版本被增加进来 以求避免Tomcat的死机 Tomcat + + and +实现了对使用ajp 的 ping/pong的支持 此属性默认为失效的
reply_timeout
此属性告诉web server在接到远端的Tomcat已死并实时的切换到集群中的另外一个Tomcat的回应之前等待一段时间 默认情况下web server将永远等待 属性值为web server要等待回应的时间(以ms为单位) 所以如果具有运行时间较长的servlet时设置其值要小心 此属性在jk 版本被增加进来 以求避免Tomcat的死机和在支持ajp 的servlet引擎上发生的问题 此属性默认为失效的
recovery_options
此属性说明了web server在检测到Tomcat失败后如何进行恢复工作 默认情况下 web server将转发请求给处于负载平衡模式中的另一个Tomcat 属性值为 说明全部恢复 属性值为 说明如果在Tomcat接到请求后出现失败状况 则不进行恢复 属性值为 说明如果在Tomcat发送头给客户端后出现失败状况 则不进行恢复 属性值为 说明如果在Tomcat接到请求后出现失败状况或者在Tomcat发送头给客户端后出现失败状况 则不进行恢复 此属性在jk 版本被增加进来 以求避免Tomcat的死机和在支持ajp 的servlet引擎上发生的问题 此属性默认为全部恢复
例如 一个名为 worker 的worker的配置
worker worker host=worker worker port= worker worker lbfactor= worker worker cachesize= worker worker cache_timeout= worker worker socket_keepalive= worker worker want ajp connection to be dropped after mn (timeout)worker worker socket_timeout=
说明 上例中的worker要求操作系统在连接上发送KEEP ALIVE信号
注意 在ajpv 协议中默认端口为
设置lb Worker属性
负载平衡类型的worker并不与Tomcat worker通讯 它负责管理这些Tomcat worker
其管理范围如下
* 初始化在web server的worker列表中定义的worker
* 使用worker的负载平衡权值 执行基于权值的负载平衡 将数量多的请求发送到负载平衡权值高(在web server看来就是更加健壮的)的worker
* 维护在同一个Tomcat worker上的同一个session的请求 使其发送到同一个Tomcat worker上 以达到Tomcat worker上的session一致性 持续性
* 标识已经失败的Tomcat workers 悬空发向它们的请求 在被lb worker管理的其它workers上寻找可以失败恢复的worker
被同一个lb worker管理多个worker之间的负载平衡的(基于它们的lbfactor和当前用户session) 也可以尽量避免由于单一的Tomcat进程死掉而造成这个网站被 杀 的不良反应
下表说明了lb worker接受的属性
* balanced_workers 一个由 分割的worker列表 用来声明lb worker需要被管理的workers 这些workers不应出现在worker list属性中
* sticky_session 表述是否将对SESSION ID的请求路由回到相同的Tomcat worker 如果属性值不为 它将被设置为JK_TRUE session将是粘性的 即SESSION ID的请求路由回到相同的Tomcat worker 当Tomcat正使用能够跨越多个Tomcat实例持久化session数据的Session Manager时 它将被设置为JK_FALSE 属性默认值为JK_TRUE
例如 worker balance 管理著两个workers worker worker
worker balance balanced_workers=worker worker高级lb Worker属性
JK x版本通过增加两个新的属性 local_worker_only 和 local_worker 为lb worker增添了新的负载平衡和容错支持
下面让我们举一个实际的环境作为example
一个集群具有两个节点(worker +worker ) 一个web server与tomcat workers一前一后 一个负载平衡器(lb Worker)位于节点的前面 web server的后面
配置如下
worker list=router# Define a local_worker worker using ajp worker worker port= worker worker host=worker worker type=ajp worker worker lbfactor= worker worker local_worker= # Define another local_worker worker using ajp worker worker port= worker worker host=worker worker type=ajp worker worker lbfactor= worker worker local_worker= # Define the LB workerworker router type=lbworker router balanced_workers=worker worker worker router local_worker_only=
在worker 和worker 上的local_worker标志告诉lb_worker哪个连接属于本地worker
如果 local_worker值为非 则它将被设置为JK_TRUE 用来标记 local worker 而JK_FALSE的情况则相反 如果至少一个worker被标记为local worker 则lb_worker将工作于local worker模式 这种模式下 所有的local workers将被移到在lb_worker中的内部worker列表的头部
这意味着一个带有session id的请求到达lb_worker时 相应的worker(根据权值排序 权值最大的那个worker)将被确定作为此请求的接受/处理者 如果这个 worker死掉/当机 请求将被发送到处于非错误状态的第一个local worker 如果一个没有session id的请求到达lb_worker时 此请求将被路由到第一个local worker 如果所有的local worker均处于错误状态 则这时 local_worker_only 标志显得尤其重要 如果local_worker_only的属性值为非 则它被设置为 JK_TRUE 否则被设置为 JK_FALSE 当它被设置为 JK_TRUE时 这个没有session id的请求将得到一个错误作为回应 否则lb_worker将尝试将请求路由到其它的被管理的worker上 如果其中的一个worker处于错误状态 并且恢复会话的工作并没有任何改变 local worker将查找这个没有session id的请求(因为在local worker中保存有这个请求的session) 而其它的worker只能查找带有session id的请求
注意 local_worker默认值是 local_worker_only默认值也是
为什么需要这么复杂的过程吗?
因为我们对于一个关闭的节点需要一个具有灵性的维护
在节点前面的平衡器周期性的对每个节点的特定端口进行查询 如果我们从集群中移走一个节点 我们就会隐性的关闭掉这个特定的端口 由于负载平衡器不能连接它 这个节点将被标记为down 但是我们没有移动在那个关闭的节点上的session到其它的节点上 在这个环境下 如果平衡器发送一个没有 session id的请求到一个端口被关掉的节点 那么一个错误将发生 如果平衡器测试到一个节点被标记为down的状态 而没有其它的节点允许发送没有session id的请求 这样这些陈旧的session请求就只有路由到那个被关闭的节点才能被接受 在一段时间后 这些陈旧的session将超时 由于所有的陈旧的session过期 那个不可达(被关闭)的节点将失去这个请求 同时也会导致我们的servlet系统发送一个没有session id的重定向回应给浏览器
但是可能被关闭的节点将会up 重新加入到集群中来 在它上面仍将保留着陈旧的session 所以在最后一个 session超时后 更新节点能够为陈旧的session的恢复带来希望 而不是杀掉sessions或者把它们移到其它节点上 而且有时如果那些陈旧的session中有许多big的对象 那么移动它们也将花费许多时间
jni类型的Worker属性
jni worker会在web server进程中打开一个JVM 并在其中执行Tomcat 这叫做 进程内 worker 来往于JVM的消息将通过调用JNI方法被传递 这使jni worker比那些需要使用ajp消息通讯的 进程外 worker执行的更快
注意 由于JVM是多线程的 jni worker应该只被用于在支持对线程的web server(AOLServer IIS Netscape and Apache )上 同时还应该确认在web server上使用的线程方案是否与被使用的JK web server插件相匹配
由于jni worker 打开了一个JVM 它将接受一些属性(例如classpath等)并将其传递给JVM
worker worker名 class_path 进程内 的JVM要使用的classpath 它将包括所有的Tomcat的jar文件和class 配置文件等
为了获得JSP编译器的支持 我们需要将Javac添加到classpath中 当然对于Java 需要添加tools jar到classpath 而对于JDK xx则要添加classes zip到classpath
worker worker名 class_path 用于以多行的形式声明多个classpath JK环境将用 或者 把这些classpath 连接起来
例如 给名为 wrkjni 的worker设置classpath
worker wrkjni class_path=/var/tomcat /lib/tomcat jarworker wrkjni class_path=/opt/IBMJava /lib/tools jar
worker worker名 bridge 用于标识将通过JNI方式被使用的Tomcat的类型 此属性目前有两个属性值 tomcat or tomcat Tomcat x虽然已经过时 但是被提供用于发布在一些类似iSeries系统上 此属性的默认值为tomcat
例如 给 wrkjni 设置bridge类型为tomcat
worker wrkjni bridge=tomcat
worker worker名 cmd_line 此属性提供了在Tomcat启动代码执行的命令行 使用时将命令行的命令 参数分解为多个cmd_line属性 JK环境通过在各个cmd_line属性值之间添加空格将这些cmd_line连接在一起
例如 设置 wrkjni 的cmd_line属性
worker wrkjni cmd_line= configworker wrkjni cmd_line=/etc/tomcat /conf/alt server xmlworker wrkjni cmd_line= homeworker wrkjni cmd_line=/var/tomcat
上面例子中的第一行声明了 config参数名 而第二行声明了与之对应的参数值 第三行与第四行同理
worker worker名 jvm_lib 用于声明JVM的实现库的完整路径 Jni worker使用这个路径动态装载JVM
例如 设置 wrkjni 的JVM shared lib (IBM SDK on Linux)
worker wrkjni jvm_lib=/opt/IBMJava /jre/bin/classic/libjvm so
例如 设置 wrkjni 的JVM shared lib (Sun SDK on Windows)
worker wrkjni jvm_lib=c:\\JDK\\ \\jre\\bin\\classic
worker worker名 stdout 设置JVM写它的System out的完整路径位置
例如 将 wrkjni 的JVM系统输出路径设置为/var/log/
worker wrkjni stdout=/var/log/
worker worker名 stderr 设置JVM写它的System err的完整路径位置
例如 将 wrkjni 的JVM系统错误输出路径设置为/var/log/
worker wrkjni stderr=/var/log/
worker worker名 ms 设置JVM的初始堆大小
例如 设置 wrkjni 的JVM的初始堆为 M
worker wrkjni ms=
worker worker名 mx 设置JVM的最大的堆大小
例如 设置 wrkjni 的JVM堆最大为 M
worker wrkjni mx=
worker worker名 sysprops 设置JVM的系统属性
例如 设置 wrkjni 的JVM使用法语
worker wrkjni sysprops= Duser region=FR
worker worker名 ld_path 设置附加的动态链接库路径(类似于LD_LIBRARY_PATH)
例如 添加一些动态链接库路径到 wrkjni 的java环境中
worker wrkjni ld_path=/opt/IBMJava /jre/bin/worker wrkjni ld_path=/opt/IBMJava /jre/bin/classic
注意 在Linux下 上面的ld_path并不能更新LD_LIBRARY_PATH 所以需要在执行web server之前手动更新LD_LIBRARY_PATH
属性文件宏
我们可以在属性文件中定义 宏 这些宏让我们定义属性 并在以后使用它们来构建其它的属性文件 当我们修改Java Home Tomcat Home 系统路径分隔符时这是很有用的
例如 定义了属性workers tomcat_home workers java_home
workers tomcat_home=d:\\tomcaorkers java_home=d:\\sdk\\jdk
在定义worker inprocess class_path时就可以使用前面定义的workers tomcat_home
worker inprocess class_path=$(workers tomcat_home)$(ps)classes
一个简单而完整的worker properties
文件中定义了比较完整的结构 可以做为参考模版
* 一个位于localhost的使用 端口的ajp worker
* 一个位于localhost的使用 端口的ajp worker
* 一个jni worker
* 一个lb worker 负责ajp worker ajp workers的负载平衡
文件内容如下
cha138/Article/program/Java/ky/201311/28541相关参考
Apache与Tomcat集群配置 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb
知识大全 apache server与tomcat 的区别以及整合
Tomcat是一个免费的开源的Serlvet容器它是Apache基金会的Jakarta项目中的一个核心项目由ApacheSun和其它一些公司及个人共同开发而成由于有了Sun的参与和支持最新的Ser
知识大全 Apache http Server与Tomcat整合
ApachehttpServer与Tomcat整合 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 apache+php+mysql+imap+ldap+jdk+tomcat的安装
以下过程在redhat下通过 使用软件 apache_targz imapctarZ mod_jservsoso jsdk___linuxbin mysqlpclinuxgnuitar
Tomcat集群与负载均衡 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在单一的服务器上执行W
为了减少客户端对服务端资源的请求可以开启mod_expiresso模块 在apache%C%E%D%C/"target="_blank">apache配置文件中去掉这段 “#LoadMo
关于Apache2.0和PHP5.0安装详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!随着时代
知识大全 如何让apache支持.htaccess并设置404错误页
如何让apache支持htaccess今天我在看seo优化时发现的一个问题就是定义页面的错误对网站优化有一点的好处所以我也要把自己主机上的找不到的页面设置到这里来下面就是我今天的经验了第一步:我们要找
Tomcat配置技巧精华详解分析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 配置系统管理(A
Tomcat配置技巧精华详解分析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 配置系统管理(A