Linux下Apache+Tomcat搭建负载均衡服务器集群

标签: General | 发表时间:2015-03-14 20:00 | 作者:ajaxj
出处:http://www.geek521.com

这篇文章主要讲解关于如何在Linux下搭建Apache+tomcat 负载均衡服务器集群的过程。

负载均衡集群配置(1):Tomcat的配置

修改“ tomcat/conf/server.xml ”文件
编辑server.xml文件,找到“ <Connector>”元素节点,在server.xml文件里面未注释掉的有两个 <Connector>元素节点。找到第二个也就是上面一行注释为

<!-- Definean AJP 1.3 Connector on port 8009 -->

的节点。将其修改为

<!-- Define an AJP 1.3 Connector on port 8009 -->
 <Connector port="8009" protocolhandlerclassname="org.apache.jk.server.jkcoyotehandler" protocol="AJP/1.3" redirectPort="8443" />

注意:如果是在一台PC上同时运行多个tomcat,须将每个tomcat对的server.xml文件里面的“ <Connector>”元素节点里面的port(端口号)设置为不同的值。这里不同上面只改第二个,而是两个“ <Connector>”元素节点都须要修改。

负载均衡集群配置(2):

接下来继续修改这个文件,找到“ <Connector>”元素节点下面的注释如下

!-- An Engine represents the entry point (within Catalina) that processes
         every request.  The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->
    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->

里面有

<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">

将其注释打开。这里进行tomcat的命名,即修改jvmRoute的值为tomcat实例名,不同的tomcat设置不同的值(这里不管是否是同一PC都须不同)。比如我的修改为tomcat1和tomcat2

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1" >

负载均衡集群配置(3):

接下来还是操作tomcat的server.xml文件,在 <Engine><Host>元素节点下添加以下内容

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
        <Manager className="org.apache.catalina.ha.session.BackupManager"
           expireSessionsOnShutdown="false"
           notifyListenersOnReplication="true"  
              mapSendOptions="6"/>
        <!--
         <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.1.99" 
              port="45564"
              frequency="500"
              dropTime="3000"/>
          <Receiver 
                  className="org.apache.catalina.tribes.transport.nio.NioReceiver"
              address="192.168.11.128"                                                        port="4002"
              autoBind="100"
              selectorTimeout="100"
              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>

上述添加的代码的用处请继续看第4步。

负载均衡集群配置(4):

这里还是继续操作tomcat的server.xml文件
找到刚刚添加的一长串代码中的 <Cluster>元素节点,下面开始修改,代码意义见其中的注释解释

<Membership
     className="org.apache.catalina.tribes.membership.McastService"
     address="228.0.1.99" 
     port="45564"
     frequency="500"
     dropTime="3000"/>
<!-- 解释上一句代码.
     如果主机有vpn-虚拟专用网络,需要要bind下,即添加  bind="127.0.0.1" 在Membership元素节点里面作为属性。如果没有的话可以不用加bind,否则会导致session无法复制.
     address的值表示广播地址,同一组tomcat搭建的集群配置须一样。
     port端口号,同一组tomcat搭建的集群配置须一样。
 -->
<Receiver 
     className="org.apache.catalina.tribes.transport.nio.NioReceiver"
     address="192.168.11.128"                                                   
     port="4002"
     autoBind="100"
     selectorTimeout="100"
     maxThreads="6"/>
<!-- 解释上一句代码.
     address的值表示本机IP地址,须设置为本机IP地址。
     port端口号(tomcat默认可以检测到4000~4100之间的端口)。如果是在同一台PC上配置负载均衡则需要修改,使用不同的端口号,否则会因为端口冲突而失效。
-->

负载均衡集群配置(5):项目部署文件的配置

修改待发布项目的web.xml
找到项目的web.xml文件,打开修改,在 <web-app>元素节点结束标签上面一行添加

<distributable/>

从而确保session能够复制。

负载均衡集群配置(6):Apache的配置

接下来进行Apache配置文件的修改,找到Apache安装文件夹下面的conf文件夹里面的httpd.conf文件打开并进行修改,在最后面加上一下内容

#加载mod_jk Module
LoadModule jk_module modules/mod_jk.so
<Ifmodule mod_jk.c>
#指定workers.properties文件路径
JkWorkersFile /usr/local/apache2/conf/workers.properties
#指定jk logs文件存放位置
JkLogFile /usr/local/apache2/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 KEYSIZE,
JkOptions  +ForwardKeySize +ForwardURICompat -ForwardDirectories
#JkRequestLogFormat set the requestformat
JkRequestLogFormat "%w %V %T %q %U%R"
#JkShmFile to put logs
JkShmFile /usr/local/apache2/logs/mod_jk.shm
</IfModule>
#指定哪些请求交给tomcat处理,哪些请求交给apache处理
#注意:" loadbalancer "为在workers.propertise里指定的负载分配控制器
JkMount /*.jsp loadbalancer 
#所有的jsp都交给tomcat处理

负载均衡集群配置(7):

在上一步中添加的httpd.conf文件的最后添加的配置中的workers.properties文件是不存在的,需要我们在指定的位置创建一个,查看上一步可以发现文件在 /usr/local/apache2/conf/路径下面创建。
workers.properties文件用于对负载均衡的负载器worker(即tomcat)进行具体的登记,此处的2个tomcat就作为2个worker被登记在这个文件中。
workers.properties具体配置如下:

#workers.properties
#
# in unix, weuse forward slashes:
ps=/
# workers 列表
worker.list=tomcat1,tomcat2,tomcat3,loadbalancer,status
#--------------------------------------------------------------------
# 第一个tomcat
#--------------------------------------------------------------------
worker.tomcat1.port=8009   #对应tomcat的server.xml中配置的ajp13端口号
worker.tomcat1.host=127.0.0.1  #tomcat1的主机地址,如不为本机,请填写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  # (非必要) 
#----------------------------------------------------------------------
# 第二个tomcat
#----------------------------------------------------------------------
worker.tomcat2.port=8809
worker.tomcat2.host=127.0.0.1  #tomcat2的主机IP地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
#---------------------------------------------------------------------
#第三个tomcat,使用其他ip对应的tomcat
#---------------------------------------------------------------------
worker.tomcat3.port=8009
worker.tomcat3.host=192.168.11.128
worker.tomcat3.type=ajp13
worker.tomcat3.lbfactor=1
#----------------------------------------------------------------------
# load balancerworker -负载均衡控制器
# --------------------------------------------------------------------
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat1,tomcat2,tomcat3
#指定分担请求的tomcat
worker.loadbalancer.sticky_session=1    #设置为粘性session
worker.loadbalancer.sticky_session_force=0  #设置当多次请求未响应,请求将转发
worker.status.type=status
#
# end workers.properties

负载均衡集群配置(8):

修改Apache安装陌路下的conf文件夹里的httpd.conf文件。
打开httpd.conf文件并修改。找到DocumentRoot和Directory并修改,将文件访问路径定位到tomcat的webapps文件夹,即待发布项目的存放位置

#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/usr/local/tomcat1/webapps"
<Directory "/usr/local/tomcat1/webapps">
   Require all granted
   Orderallow,deny
   Allow from all
</Directory>

到此配置基本完成。

下面就是测试的环节了。在此就不多说了。

相关 [linux apache tomcat] 推荐:

Linux下Apache+Tomcat搭建负载均衡服务器集群

- - 极客521 | 极客521
这篇文章主要讲解关于如何在Linux下搭建Apache+tomcat 负载均衡服务器集群的过程. 负载均衡集群配置(1):Tomcat的配置. 修改“ tomcat/conf/server.xml ”文件. 编辑server.xml文件,找到“ ”元素节点,在server.xml文件里面未注释掉的有两个 元素节点.

Apache整合Tomcat、集群

- - ITeye博客
Apache 整合 Tomcat 、集群. 1.1     使用mod_proxy整合. 1.2     使用mod_jk整合. 1.3.1    Tomcat集群配置. 1.3.2    mod_proxy进行负载均衡. 1.3.3    mod_jk进行负载均衡.        Apache整合Tomcat主要有两种方式,通过mod_proxy整合和通过mod_jk整合.

Docker自动部署Apache Tomcat

- - 开源软件 - ITeye博客
本文是Docker的入门文章,推荐Java开发者阅读. 文章详细介绍了如何用Docker来安装部署Tomcat. 扩展Tomcat的官方Dockerfile. 在容器里部署RESTful的Web服务并测试. 使用docker search可以查到最流行的(和官方的)Docker Tomcat容器: .

Linux、mysql、tomcat大并发下的配置

- - Linux - 操作系统 - ITeye博客
    因为之前一直没太接触过项目实现部署的问题,所以中间出现了N多问题,现在有时间了,做了一个整理,已备后用. 此处不包括上一层服务器的负载,如使用nginx/apache等. 配置项目中的连接池最大连接数 <= mysql的max_connections(如项目有集群,则乘N). 可解决出现:MySQL 提示 Too many connections ( 1040 ).

apache与tomcat负载集群的3种方法

- dongsheng - BlogJava-首页技术区
花了两天时间学习apache与tomcat的集成方法,现在把学习成果记录下来. apache与tomcat负载集群集成方法有3种jk、jk_proxy、http_proxy. 本次测试是1个apache集成两个tomcat. 安装apache http server省略,访问地址为http://127.0.0.1:8081.

Apache Tomcat 6.0.35前有拒绝服务,信息泄露等漏洞

- - C1G军火库
Apache Tomcat 6.0.35前有信息泄露相关的一个漏洞(CVE-2011-3375),. 以及另一个在此前广受关注的哈希碰撞引发拒绝服务(DoS)漏洞(CVE-2012-0022),. Apache 建议用户对 Tomcat 进行升级从而规避此漏洞. 一.安装Oracle JRockit.

Apache与Tomcat的3种连接方式分析

- - 服务器运维与网站架构|Linux运维|互联网研究
首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接. 事实上 Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端口可以直接使用 Tomcat 所运行的应用程序,你也可以将该端口改为 80. 既然 Tomcat 本身已经可以提供这样的服务,我们为什么还要引入 Apache 或者其他的一些专门的 HTTP 服务器呢.

Apache+Tomcat+Memcached共享Session的构架设计

- - CSDN博客架构设计推荐文章
一、       方案目标. 实现互动留言系统、后台发布系统的高可用性,有效解决高并发量对单台应用服务器的冲击,确保应用服务器单点故障不影响系统正常运行. 二、       部署架构. 采取Tomcat集群的部署方式,Apache通过proxy_module代理方式对用户的请求进行负载均衡,转发至tomcat集群中的某一实例进行处理,tomcat集群之间通过Memcached高性能缓存集群共享持久Session.

Apache Tomcat DIGEST身份验证多个安全漏洞(CVE-2012-3439)

- - C1G军火库
发布时间: 2012-11-05 (GMT+0800). Apache Tomcat是一个流行的开放源码的JSP应用服务器程序. Apache Tomcat 7.0.0-7.0.27、6.0.0-6.0.35、5.5.0-5.5.35存在多个安全漏洞,成功利用后可允许攻击者绕过安全限制并执行非法操作.

使用 Redis 来存储 Apache Tomcat 7 的 Session

- - 编程语言 - ITeye博客
使用  Redis 服务器来存储Session非常有优势. 首先它是一个NOSQL数据,第二它很容易扩展使用. This kind of setup would lead to a clear understanding of how  Redis can behave as cache as well as a session storing system.