知识大全 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集群配置

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集群与负载均衡

Tomcat集群与负载均衡  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在单一的服务器上执行W

知识大全 apache设置静态文件缓存方法介绍

  为了减少客户端对服务端资源的请求可以开启mod_expiresso模块  在apache%C%E%D%C/"target="_blank">apache配置文件中去掉这段  “#LoadMo

知识大全 关于Apache 2.0和PHP5.0安装详解

关于Apache2.0和PHP5.0安装详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!随着时代

知识大全 如何让apache支持.htaccess并设置404错误页

如何让apache支持htaccess今天我在看seo优化时发现的一个问题就是定义页面的错误对网站优化有一点的好处所以我也要把自己主机上的找不到的页面设置到这里来下面就是我今天的经验了第一步:我们要找

知识大全 Tomcat配置技巧精华详解分析

Tomcat配置技巧精华详解分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  配置系统管理(A

知识大全 Tomcat 配置技巧精华详解分析

Tomcat配置技巧精华详解分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  配置系统管理(A