最近一段时间一直在研究实现apache + jk_mod + tomcat实现负载均衡,起初负载均衡算是配置蛮顺利的,但是到了配置tomcat集群时所有配置都没有问题,但是tomcat日志中一直提示没有集群成员加入,为此搞了很久也没有解决,官方的文档也看了不少遍。最后突然想到tomcat集群是通过组播通讯,而组播通讯是通过udp协议实现通讯的,那么集群启动都正常,就是没有集群成员加入,会不会是因为iptables,设置问题,因此查看了45564端口发现是以tcp进行通讯,而实际上应该是以udp进行通讯。修改iptables规则后,集群终于成功。同时要特别注意,网上很多配置文章要么配置错误,要么配置不全,不可完全参考。

     负载均衡配置

  • 负载均衡实现的两种方式

1、mod_jk

2、mod_proxy

本篇文章是基于mod_jk进行配置的

  • mod_jk安装配置

1、下载mod_jk并安装mod_jk
                         下载地址:http://tomcat.apache.org/download-connectors.cgi

       wget http://mirrors.cnnic.cn/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.40-src.tar.gztar -xzvf tomcat-connectors-1.2.40-src.tar.gzcd /tomcat-connectors-1.2.40-src/native/./configure --with-apxs=/usr/local/apache2/bin/apxsmake && make installmake clean

mod_jk.so会安装在/usr/local/apache2/modules/mod_jk.so

2、如果在安装apr环境变量,则需要配置apr环境变量

在安装完毕后会提示以下内容

        If you ever happen to want to link against installed librariesin a given directory, LIBDIR, you must either use libtool, andspecify the full pathname of the library, or use the `-LLIBDIR'flag during linking and do at least one of the following:- add LIBDIR to the `LD_LIBRARY_PATH' environment variableduring execution- add LIBDIR to the `LD_RUN_PATH' environment variableduring linking- use the `-Wl,-rpath -Wl,LIBDIR' linker flag- have your system administrator add LIBDIR to `/etc/ld.so.conf'

根据提示,设置mod_jk环境变量

        export LD_LIBRARY_PATH=/usr/local/libexport LD_RUN_PATH=/usr/local/binexport PATH=$PATH:$LD_RUN_PATHexport CLASSPATH=$CLASSPATH:$LD_LIBRARY_PATH
  • httpd.conf配置
    #加载http_jk.conf#引用http_jk的配置文件include          conf/extra/http_jk.conf# 加载 mod_jk 模块 LoadModule    jk_module modules/mod_jk.so
  • 配置httpd-vhost.conf文件
        # Virtual Hosts## Required modules: mod_log_config# If you want to maintain multiple domains/hostnames on your# machine you can setup VirtualHost containers for them. Most configurations# use only name-based virtual hosts so the server doesn't need to worry about# IP addresses. This is indicated by the asterisks in the directives below.## Please see the documentation at # <URL:http://httpd.apache.org/docs/2.4/vhosts/># for further details before you try to setup virtual hosts.## You may use the command line option '-S' to verify your virtual host# configuration.## VirtualHost example:# Almost any Apache directive may go into a VirtualHost container.# The first VirtualHost section is used for all requests that do not# match a ServerName or ServerAlias in any <VirtualHost> block.<VirtualHost IP:80>ServerAdmin service@域名.comServerName 域名DocumentRoot "/home/webapps/应用程序目录"DirectoryIndex index.do login.do index.jsp login.jspErrorLog "/home/logs/apache2/域名.com-error_log"CustomLog "/home/logs/apache2/域名-access_log" commonJkMount /*.jsp jk_controllerJkMount /*.do jk_controllerJkMount /*Servlet jk_controllerJkMount /Servlet/* jk_controllerJkMount /servlet/* jk_controllerJkMount /kaptcha.jpg* jk_controllerJkMount /j_spring_security_check jk_controllerJkMount /jkStatus jk_watcher<Directory "/home/webapps/应用程序目录">Options MultiViewsAllowOverride NoneAllow from all</Directory></VirtualHost>
  • httpd_jk.conf 配置

httpd_jk.conf主要定义 mod_jk 模块的位置、哪些访问地址需要转交给tomcat应用服务器处理、及 mod_jk 模块的连接日志设置,还有定义 worker.properties 文件的位置。在/usr/local/apache2/conf/extra/目录下创建httpd_jk.conf配置文件,并写入如下内容:

        # 指定  workers.properties 文件路径JkWorkersFile conf/workers.properties# 指定那些请求交给 tomcat 处理 ,"jk_controller" 为在 workers.propertise 里指定的负载分配控制器JkMount /*.jsp jk_controllerJkMount /*.do jk_controllerJkMount /*.action jk_controllerJkMount /*Servlet jk_controllerJkMount /Servlet/* jk_controllerJkMount /servlet/* jk_controller#JkMount /j_spring_security_check jk_controller# 指定 log 目录  JkLogFile /home/logs/apache2/mod_jk/mod_jk2.logJkShmFile /home/logs/apache2/mod_jk/mod_jk.shm# Set the jk log level [debug/error/info]JkLogLevel info# Select the log formatJkLogStampFormat "[%a %b %d %H:%M:%S %Y]"# JkOptions indicate to send SSL KEY SIZE,JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories# JkRequestLogFormat set the request formatJkRequestLogFormat "%w %V %T"

需要配置JkShmFile路径,否则会提示以下错误

       No JkShmFile defined in httpd.conf. Using default /usr/local/apache2/logs/jk-runtime-status

apache不会过滤配置中的命令行的空格,因此我们必须保证命令与参数之间是真正的空格隔开,另外在配置文件尾部不能有多余的空行,否则在启动apache时,会出现类似以下这样的错误提示,另外也要注意apache无法识别中文字符。否则提示类似下面的错误

       AH00526: Syntax error on line 12 of /usr/local/apache2/conf/extra/http_jk.conf:Invalid command 'JkMount\xc2\xa0/*\xc2\xa0controller\xc2\xa0', perhaps misspelled or defined by a module not included in the server configurationAH00526: Syntax error on line 12 of /usr/local/apache2/conf/extra/mod_jk.conf:JkMount needs a path when not defined in a location
  • workers.properties配置

1、worker常见属性

        ajp13                    :此类型表示当前worker为一个运行着的Tomcat实例。lb                       :lb即load balancing,专用于负载均衡场景中的woker;此worker并不真正负责处理用户请求,而是将用户请求调度给其它类型为ajp13的worker。status                   :用户显示分布式环境中各实际worker工作状态的特殊worker,它不处理任何请求,也不关联到任何实际工作的worker实例。具体示例如请参见后文中的配置。        host                     :Tomcat 7的worker实例所在的主机port                     :Tomcat 7实例上AJP1.3连接器的端口connection_pool_minsize  :最少要保存在连接池中的连接的个数;默认为pool_size/2connection_pool_timeout  :连接池中连接的超时时长mount                    :由当前worker提供的context路径,如果有多个则使用空格格开;此属性可以由JkMount指令替代retries                  :错误发生时的重试次数socket_timeout           :mod_jk等待worker响应的时长,默认为0,即无限等待socket_keepalive         :是否启用keep alive的功能,1表示启用,0表示禁用lbfactor                 :worker的权重,可以在负载均衡的应用场景中为worker定义此属性        ajp13        :此类型表示当前worker为一个运行着的Tomcat实例。lb                       :lb即load balancing,专用于负载均衡场景中的woker;此worker并不真正负责处理用户请求,而是将用户请求调度给其它类型为ajp13的worker。status                   :用户显示分布式环境中各实际worker工作状态的特殊worker,它不处理任何请求,也不关联到任何实际工作的worker实例。具体示例如请参见后文中的配置。balance_workers          :用于负载均衡模式中的各worker的名称列表,需要注意的是,出现在此处的worker名称一定不能在任何worker.list属性列表中定义过,并且worker.list属性中定义的worker名字必须包含负载均衡worker。具体示例请参见后文中的定义。method                   :可以设定为R、T或B;默认为R,即根据请求的个数进行调度;T表示根据已经发送给worker的实际流量大小进行调度;B表示根据实际负载情况进行调度。sticky_session           :在将某请求调度至某worker后,源于此址的所有后续请求都将直接调度至此worker,实现将用户session与某worker绑定。默认为值为1,即启用此功能。如果后端的各worker之间支持session复制,则可以将此属性值设为0。

2、worker配置

mod_jk安装包tomcat-connectors-1.2.32-src中已经自带了workers.properties包含默认配置和最小配置两种,也可以自行创建workers.properties,然后将workers.properties上传到/usr/local/apache2/conf目录下,以下是workers.properties的配置内容

        #JVMRoute-pj001, JVMRoute-pj002对应tomcat的engine的jvmRoute的名称worker.list=jk_controller,jk_watcher,JVMRoute-pj001,JVMRoute-pj002#JVMRoute-pj001的tomcat节点配置#JK模块实现负载均衡采用的是AJP协议1.3版本,负载均衡服务器的类型配置为ajp13worker.JVMRoute-pj001.type=ajp13#负载均衡服务器的主机名、域名或者IP地址worker.JVMRoute-pj001.host=192.168.1.100#负载均衡服务器AJP协议连接器的连接端口worker.JVMRoute-pj001.port=8009 #8009 + 0 #负载均衡服务器在整个负载均衡系统中所占的权重worker.JVMRoute-pj001.lbfactor=1#apache服务器是多线程的,tomcat能够利用这一优势来维持一定数量的连接作为缓存。worker.JVMRoute-pj001.socket_keepalive=1worker.JVMRoute-pj001.socket_timeout=300# 指定 JVMRoute-pj001 无法提供服务后由 JVMRoute-pj002 继续提供服务worker.JVMRoute-pj001.redirect=JVMRoute-pj002#JVMRoute-pj002的tomcat节点配置,端口号+1000,保证唯一worker.JVMRoute-pj002.type=ajp13worker.JVMRoute-pj002.host=192.168.1.101worker.JVMRoute-pj002.port=8109 #8009 + 100worker.JVMRoute-pj002.lbfactor=10#apache服务器是多线程的,tomcat能够利用这一优势来维持一定数量的连接作为缓存。worker.JVMRoute-pj002.socket_keepalive=1worker.JVMRoute-pj002.socket_timeout=300# 指定 JVMRoute-pj002 无法提供服务后由 JVMRoute-pj001 继续提供服务worker.JVMRoute-pj002.redirect=JVMRoute-pj001#========jk_controller,负载均衡控制器========#这里配置为lb,也就是Load Balance负载均衡worker.jk_controller.type=lb#拥有哪些负责负载均衡的服务器实例worker.jk_controller.balance_workers=JVMRoute-pj001, JVMRoute-pj002#设置负载均衡是否采用粘性会话。如果该属性设置为true,假设一个请求被s1处理了,下次来源于同一个客户端的请求也将被s1处理。worker.jk_controller.sticky_session=true#========jk_watcher,负载均衡监视器========worker.jk_watcher.type=statusworker.jk_watcher.read_only=false#设置名称为jk_watcher的负载均衡服务器实例监视器的挂载路径,通过http://218.5.76.101/jkStatus访问worker.jk_watcher.mount=/jkStatus#worker全局的重试次数。在apache服务器启动后,会最多尝试若干次去连接这些负载均衡服务器,若连接不上就认为是down掉了,这里配置为3worker.retries=3

负载均衡监控平台访问地址:http://ip地址/jkStatus

tomcat集群配置

  • iptables设置

1、开启防火墙端口

防火墙端口开放参考上面的设置。tomcat集群开放的根据tomcat的配置文件server.xml进行开放,一般需要开放的端口有

8005,8080,8009,8443,45564,4000:4100

2、验证服务器是否启用组播

执行ifconfig查看网卡信息,若ifconfig命令显示的内容中含有红线部分的内容表示支持组播通讯

3、端口通讯协议验证

45564端口以udp进行通讯,如果设定成tcp通讯,将会导致集群配置无法成功

4000-4100以tcp进行通讯

4、添加集群路由

          route add -net 224.0.0.0 netmask 240.0.0.0 dev eth2
  • 修改tomcat配置文件

1、修改链接器端口号

若是同一台服务部署多个tomcat,则链接器的端口号必须保证唯一,若是不同台服务器,由于ip不一样可以不修改

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

2、定义Engine节点的jvmRoute名称

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

改为

         <Engine name="Catalina"    defaultHost="localhost" jvmRoute="JVMRoute-pj001">  

其中JVMRoute-pj001必须与workers.properties中的定义的保持一致

3、启用tomcat集群,实现session共享

配置集群有两种方式,一种是节点对节点的全拷贝,就是all to all,以下第一种就是,配置起来比较简单。另外一种是根据需要进行配置。tomcat7默认是采用DeltaManager模式,它通过将改变了会话数据同步给集群中的其它节点实现会话复制。

1、若是拷贝所有的session,则直接启用即可

              <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

这种方式经过测试只能实现粘性session模式,无粘性模式测试不成功,sessionid测试一直变化,无法保证唯一,而且根据官方说明也只能采用无粘性模式。在这边绕了很久,花了很长时间才搞清楚。

2、完整配置

      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"><Manager className="org.apache.catalina.ha.session.BackupManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"mapSendOptions="6"/><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="172.20.206.146"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"/><ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/><ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/></Cluster>
  • 域名绑定访问

1、apache:修改/usr/local/apache2/conf/extra/httpd-vhosts.conf,假设站点目录为/home/webapps/site

     <VirtualHost ip地址:80>ServerAdmin zouqf@ps007.comServerName 域名           ServerAlias 域名DocumentRoot "/home/webapps/site"ErrorLog "/home/logs/apache2/域名-error_log"CustomLog "/home/logs/apache2/域名-access_log" commonJkMount /*.jsp JVMRoute-pj001JkMount /*.do JVMRoute-pj001JkMount /*Servlet JVMRoute-pj001JkMount /Servlet/* JVMRoute-pj001JkMount /servlet/* JVMRoute-pj001JkMount /j_spring_security_check JVMRoute-pj001JkMount /jkStatus jk_watcher<Directory "/home/webapps/site">Options MultiViewsAllowOverride NoneAllow from all</Directory></VirtualHost>

2、修改/usr/local/tomcat/conf/server.xml

       <Host name="www.站点域名.com" debug="0" appBase="webapps"unpackWARs="true" autoDeploy="true"><alias>www.站点域名.com</alias><Context path="" docBase="/home/webapps/site" debug="0" reloadable="true"/></Host>
  • Session序列化

tomcat集群中,站点中的javabean必须能够序列化,这样才能实现共享和持久化和共享,而java自带的序列化机制效率不高,因此可以使用自定义的序列化包,有多种自定义的序列化包,以下为比较常用的序列化包

1、kryo-serializer: msm-kryo-serializer, kryo-serializers, kryo, minlog, reflectasm, asm-3.2
            2、javolution-serializer: msm-javolution-serializer, javolution-5.4.3.1
            3、xstream-serializer: msm-xstream-serializer, xstream, xmlpull, xpp3_min
            4、flexjson-serializer: msm-flexjson-serializer, flexjson

  • 参考资料:

说明网上实现tomcat集群配置内容不一,有的内容错误,有的内容残缺不全,需要花费一点时间研究

http://m.oschina.net/blog/87469
             http://www.cnblogs.com/itech/archive/2009/08/18/1548723.html
             http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html
             http://blog.csdn.net/bluishglc/article/details/6867358
             http://blog.csdn.net/maxracer/article/details/7207279
             http://blog.csdn.net/chaijunkun/article/details/6987443
             http://blog.sina.com.cn/s/blog_5f53615f0100p4fj.html
             http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/
             http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
             http://www.verydemo.com/demo_c199_i25182.html
             http://blog.csdn.net/kobe_lzq/article/details/7047834
             http://blog.csdn.net/lifetragedy/article/details/7712691

http://blog.csdn.net/lifetragedy/article/details/7707455

http://www.it165.net/admin/html/201409/3804.html
             http://www.linuxidc.com/Linux/2014-09/107336.htm
             http://blog.i5a6.com/901.html
             http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/index.html

转载于:https://www.cnblogs.com/wala-wo/p/5119225.html

linux+apache+mod_Jk+tomcat实现tomcat集群相关推荐

  1. Linux平台上搭建apache+tomcat负载均衡集群

    传统的Java Web项目是通过tomcat来运行和发布的.但在实际的企业应用环境中,采用单一的tomcat来维持项目的运行是不现实的.tomcat 处理能力低,效率低,承受并发小(1000左右).当 ...

  2. tomcat实现session集群及tomcat+memcached共享session存储(四)

    接博客nginx或httpd实现负载均衡tomcat(三) tomcat实现会话管理原理及实现: tomcat管理会话使用的专用的会话管理组件,tomcat的会话管理器有4种: 1.标准会话管理器(S ...

  3. Nginx+Tomcat 负载均衡集群方案

    2019独角兽企业重金招聘Python工程师标准>>> Nginx+Tomcat 负载均衡集群方案 该方案是我之前做过的一个项目生产应用的,目前运行良好,如何您生产使用,请先做好测试 ...

  4. 搭建Nginx+Tomcat 负载均衡集群

    Nginx+Tomcat 负载均衡集群 一. 实验拓扑: 二. 实验要求: 1. 试验环境: 主机 操作系统 所需软件 Nginx服务器 rhel 6.5 x86_64 nginx-1.6.0.tar ...

  5. kubernetes中mysql乱码_在kubernetes中部署tomcat与mysql集群-Go语言中文社区

    在kubernetes中部署tomcat与mysql集群之前必须要有以下这些基础: 1. 已安装.配置kubernetes 2. 集群中有tomcat与mysql容器镜像 3. 有docker基础 具 ...

  6. Linux 高可用(HA)集群之Pacemaker详解

    大纲 说明:本来我不想写这篇博文的,因为前几篇博文都有介绍pacemaker,但是我觉得还是得写一下,试想应该会有博友需要,特别是pacemaker 1.1.8(CentOS 6.4)以后,pacem ...

  7. 使用LVS(Linux Virtual Server)在Linux上搭建负载均衡的集群服务

    使用LVS(Linux Virtual Server)在Linux上搭建负载均衡的集群服务 一.基于于NAT的LVS的安装与配置. 1. 硬件需求和网络拓扑                       ...

  8. Linux上搭建Hadoop2.6.3集群以及WIN7通过Eclipse开发MapReduce的demo

    随笔 - 70  文章 - 0  评论 - 88 Linux上搭建Hadoop2.6.3集群以及WIN7通过Eclipse开发MapReduce的demo 近期为了分析国内航空旅游业常见安全漏洞,想到 ...

  9. 在Linux上使用Nginx为Solr集群做负载均衡

    在Linux上使用Nginx为Solr集群做负载均衡 在Linux上搭建solr集群时需要用到负载均衡,但测试环境下没有F5 Big-IP负载均衡交换机可以用,于是先后试了weblogic的proxy ...

  10. 博文推荐|Apache Doris 单节点 Docker 集群制作教程

    前言 Apache Doris 是当下非常流行的 MPP 架构 OLAP 数据库,很多同学想自学/测试 Doris 的使用和能力,但是又苦于没有环境或者畏惧冗长的编译+搭建过程,整个过程极大的劝退了很 ...

最新文章

  1. C语言访问内部ROM,C语言随笔2: rom ram 及其运行的过程
  2. h5 bootstrap 小程序模板_一道面试题小程序与H5的区别
  3. WinCE项目-UPS电源管理系统
  4. IPv6域名解析服务基础
  5. LiveVideoStack音视频技术2018年度评奖揭晓
  6. 快速傅里叶变换(FFT)详解
  7. 32位和64位机器上C语言数据类型的大小
  8. HTML中利用纯Microsoft Ajax Library做出可调用WebSerives的AutoComplete
  9. .Net学习(三):初识ASP.Net
  10. image1载入大图片时如果stretch=true,image1会显示出大图片的缩图,那么如何将这个缩图镜像复制一份赋值给另一个image2的picture呢?...
  11. java贪吃蛇源代码_java贪吃蛇源代码详解
  12. win10强行自定义分辨率(笔记本win10强行自定义分辨率)
  13. C#方法名前的方括号是干嘛用的呀?
  14. AI Arena:Paradigm领投的NFT AI竞技场
  15. web前端面试技巧-如何自我介绍?如何应对hr?
  16. FIFA Women's World Cup France 2019™ -国际足协继海奶奶女子世足杯曲终人散,USA碰杯
  17. odoo服务器设置说明
  18. ubuntu18.04 设置字体样式, 调整字体大小
  19. [讨论]什么是网络安全?
  20. Where Softirq Is Invoked

热门文章

  1. 简单日历的制作 java
  2. 爱立信提名新董事长;舍弗勒收购德国太阳能农场;爱达邮轮和上海电信打造首艘“5G邮轮” | 美通企业日报...
  3. 川崎机器人怎样操作返回原点_川崎工业机器人的基本操作
  4. 经典的蓝色CSS下拉菜单
  5. mysql isnull()用法
  6. 解决VSCode打开GBK编码文件乱码问题
  7. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(2)之创建项目
  8. JAVA—— Redis基础
  9. 【Linux】rm -rf 血的教训
  10. 前端面试题+答案(JS篇)