一、apache代理tomcat

       上篇博文已经学习了nginx代理和负载均衡tomcat及apache基于mod_proxy模块代理tomcat;

现在来学习下apache基于mod_jk模块实现代理及负载均衡Tomcat Cluster

1、基于httpd代理tomcat时可以使用httpd的两个模块

 1)mod_jk:第三方模块

     mod_jk是ASF的一个项目,是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务端是Tomcat的AJP连接器)。

后端tomcat使用的连接器:tomcat ajp

 2)mod_proxy:标配模块

       mod_proxy_http

       mod_proxy_ajp

       mod_proxy_balancer:负载均衡

后端tomcat使用的连接器:mod_porxy_http: tomcat http,mod_proxy_ajp: tomcat ajp

二、httpd基于jk_module模块代理tomcat

1、环境

客户端:Windows 192.168.200.88 

node5: CentOS6.7-x86_64 eth0:192.168.100.175 eth1:192.168.200.175  httpd

node6:CentOS6.5-x86_64 eth0:192.168.200.179  tomcat1

node7:CentOS6.5-x86_64 eth0:192.168.200.180  tomcat2

拓扑图就不画了,很简单的

2、先部署后端node7上的TomcatB

注意:为了安全考虑不应该使用root用户运行tomcat,应该把tomcat的文件修改成普通用户tomcat,并切换至tomcat用户再启动tomcat,

 1)安装jdk

[root@BAIYU_180 src]# lsapache-tomcat-8.0.29.tar.gz  jdk-8u65-linux-x64.tar.gz[root@BAIYU_180 src]# tar xf jdk-8u65-linux-x64.tar.gz -C /usr/local[root@BAIYU_180 src]# ls /usr/local/jdk1.8.0_65/bin        include         lib      README.html  THIRDPARTYLICENSEREADME-JAVAFX.txtCOPYRIGHT  javafx-src.zip  LICENSE  release      THIRDPARTYLICENSEREADME.txtdb         jre             man      src.zip[root@BAIYU_180 src]# ln -sv /usr/local/jdk1.8.0_65 /usr/local/jdk"/usr/local/jdk" -> "/usr/local/jdk1.8.0_65"[root@BAIYU_180 src]# ls /usr/local/jdkbin        include         lib      README.html  THIRDPARTYLICENSEREADME-JAVAFX.txtCOPYRIGHT  javafx-src.zip  LICENSE  release      THIRDPARTYLICENSEREADME.txtdb         jre             man      src.zip

 添加环境变量

[root@BAIYU_180 src]# vi /etc/profile.d/java.sh  1 export JAVA_HOME=/usr/local/jdk  2 export PATH=$JAVA_HOME/bin:$PATH[root@BAIYU_180 src]# . /etc/profile.d/java.sh[root@BAIYU_180 src]# java -version                 #安装成功java version "1.8.0_65"Java(TM) SE Runtime Environment (build 1.8.0_65-b17)Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)

2)安装tomcat

[root@BAIYU_180 src]# lsapache-tomcat-8.0.29.tar.gz  jdk-8u65-linux-x64.tar.gz[root@BAIYU_180 src]# tar xf apache-tomcat-8.0.29.tar.gz -C /usr/local[root@BAIYU_180 src]# ls /usr/local/apache-tomcat-8.0.29/bin   lib      logs    RELEASE-NOTES  temp     workconf  LICENSE  NOTICE  RUNNING.txt    webapps[root@BAIYU_180 src]# ln -sv /usr/local/apache-tomcat-8.0.29/ /usr/local/tomcat"/usr/local/tomcat" -> "/usr/local/apache-tomcat-8.0.29/"[root@BAIYU_180 src]# ls /usr/local/tomcatbin   lib      logs    RELEASE-NOTES  temp     workconf  LICENSE  NOTICE  RUNNING.txt    webapps

 添加环境变量

[root@BAIYU_180 src]# lsapache-tomcat-8.0.29.tar.gz  jdk-8u65-linux-x64.tar.gz[root@BAIYU_180 src]# tar xf apache-tomcat-8.0.29.tar.gz -C /usr/local[root@BAIYU_180 src]# ls /usr/local/apache-tomcat-8.0.29/bin   lib      logs    RELEASE-NOTES  temp     workconf  LICENSE  NOTICE  RUNNING.txt    webapps[root@BAIYU_180 src]# ln -sv /usr/local/apache-tomcat-8.0.29/ /usr/local/tomcat"/usr/local/tomcat" -> "/usr/local/apache-tomcat-8.0.29/"[root@BAIYU_180 src]# ls /usr/local/tomcatbin   lib      logs    RELEASE-NOTES  temp     workconf  LICENSE  NOTICE  RUNNING.txt    webapps[root@BAIYU_180 src]# vi /etc/profile.d/tomcat.sh  1 export CATALINA_HOME=/usr/local/tomcat  2 export PATH=$CATALINA_HOME/bin:$PATH[root@BAIYU_180 src]# . /etc/profile.d/tomcat.sh[root@BAIYU_180 src]# catalina.sh -hUsing CATALINA_BASE:   /usr/local/tomcatUsing CATALINA_HOME:   /usr/local/tomcatUsing CATALINA_TMPDIR: /usr/local/tomcat/tempUsing JRE_HOME:        /usr/local/jdkUsing CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jarUsage: catalina.sh ( commands ... )commands:  debug             Start Catalina in a debugger  debug -security   Debug Catalina with a security manager  jpda start        Start Catalina under JPDA debugger  run               Start Catalina in the current window  run -security     Start in the current window with security manager  start             Start Catalina in a separate window  start -security   Start in a separate window with security manager  stop              Stop Catalina, waiting up to 5 seconds for the process to end  stop n            Stop Catalina, waiting up to n seconds for the process to end  stop -force       Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running  stop n -force     Stop Catalina, wait up to n seconds and then use kill -KILL if still running  configtest        Run a basic syntax check on server.xml - check exit code for result  version           What version of tomcat are you running?Note: Waiting for the process to end and use of the -force option require that $CATALINA_PID is defined[root@BAIYU_180 src]# catalina.sh version           #安装成功Using CATALINA_BASE:   /usr/local/tomcatUsing CATALINA_HOME:   /usr/local/tomcatUsing CATALINA_TMPDIR: /usr/local/tomcat/tempUsing JRE_HOME:        /usr/local/jdkUsing CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jarServer version: Apache Tomcat/8.0.29Server built:   Nov 20 2015 09:18:00 UTCServer number:  8.0.29.0OS Name:        LinuxOS Version:     2.6.32-431.el6.x86_64Architecture:   amd64JVM Version:    1.8.0_65-b17JVM Vendor:     Oracle Corporation

 3)创建系统用户tomcat运行tomcat

[root@BAIYU_180 src]# useradd -r tomcat[root@BAIYU_180 src]# cd /usr/local/tomcat/[root@BAIYU_180 tomcat]# ll总用量 112drwxr-xr-x 2 root root  4096 11月 29 12:42 bindrwxr-xr-x 2 root root  4096 11月 20 17:20 confdrwxr-xr-x 2 root root  4096 11月 29 12:42 lib-rw-r--r-- 1 root root 57011 11月 20 17:20 LICENSEdrwxr-xr-x 2 root root  4096 11月 20 17:18 logs-rw-r--r-- 1 root root  1444 11月 20 17:20 NOTICE-rw-r--r-- 1 root root  6741 11月 20 17:20 RELEASE-NOTES-rw-r--r-- 1 root root 16195 11月 20 17:20 RUNNING.txtdrwxr-xr-x 2 root root  4096 11月 29 12:42 tempdrwxr-xr-x 7 root root  4096 11月 20 17:19 webappsdrwxr-xr-x 2 root root  4096 11月 20 17:18 work[root@BAIYU_180 tomcat]# chown -R tomcat.tomcat . [root@BAIYU_180 tomcat]# ll总用量 112drwxr-xr-x 2 tomcat tomcat  4096 11月 29 12:42 bindrwxr-xr-x 2 tomcat tomcat  4096 11月 20 17:20 confdrwxr-xr-x 2 tomcat tomcat  4096 11月 29 12:42 lib-rw-r--r-- 1 tomcat tomcat 57011 11月 20 17:20 LICENSEdrwxr-xr-x 2 tomcat tomcat  4096 11月 20 17:18 logs-rw-r--r-- 1 tomcat tomcat  1444 11月 20 17:20 NOTICE-rw-r--r-- 1 tomcat tomcat  6741 11月 20 17:20 RELEASE-NOTES-rw-r--r-- 1 tomcat tomcat 16195 11月 20 17:20 RUNNING.txtdrwxr-xr-x 2 tomcat tomcat  4096 11月 29 12:42 tempdrwxr-xr-x 7 tomcat tomcat  4096 11月 20 17:19 webappsdrwxr-xr-x 2 tomcat tomcat  4096 11月 20 17:18 work[root@BAIYU_180 tomcat]# su - tomcat-bash-4.1$ catalina.sh startUsing CATALINA_BASE:   /usr/local/tomcatUsing CATALINA_HOME:   /usr/local/tomcatUsing CATALINA_TMPDIR: /usr/local/tomcat/tempUsing JRE_HOME:        /usr/local/jdkUsing CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jarTomcat started.

测试:

4)再添加一个测试页面

[root@BAIYU_180 ~]# cd /usr/local/tomcat/[root@BAIYU_180 tomcat]# lsbin  conf  lib  LICENSE  logs  NOTICE  RELEASE-NOTES  RUNNING.txt  temp  webapps  work[root@BAIYU_180 webapps]# mkdir -pv testapp/{classes,lib,WEB-INF,META-INF}mkdir: 已创建目录 "testapp"mkdir: 已创建目录 "testapp/classes"mkdir: 已创建目录 "testapp/lib"mkdir: 已创建目录 "testapp/WEB-INF"mkdir: 已创建目录 "testapp/META-INF"[root@BAIYU_180 webapps]# vi testapp/index.jsp  1 <%@ page language="java" %>  2   3   TomcatB  4     5     

TomcatB.magedu.com

  6     
  7         8         Session ID  9     <% session.setAttribute("magedu.com","magedu.com"); %> 10         <%= session.getId() %> 11        12        13         Created on 14         <%= session.getCreationTime() %> 15       16      17    18 

测试:

3、安装httpd并添加jk_module模块

 1)安装httpd

[root@BAIYU_175 ~]# yum install httpd httpd-devel -y #直接Yum安装了[root@BAIYU_175 ~]# service httpd start[root@BAIYU_175 ~]# httpd -M|grep jk    #默认没有安装mod_jk模块httpd: apr_sockaddr_info_get() failed for BAIYU_175httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerNameSyntax OK

测试:

2)安装jk_module模块

  [root@BAIYU_175 ~]# lsanaconda-ks.cfg  install.log.syslog                   trash.shinstall.log      tomcat-connectors-1.2.40-src.tar.gz[root@BAIYU_175 ~]# tar xf tomcat-connectors-1.2.40-src.tar.gz [root@BAIYU_175 ~]# cd tomcat-connectors-1.2.40-src[root@BAIYU_175 tomcat-connectors-1.2.40-src]# lsconf  HOWTO-RELEASE.txt  LICENSE  NOTICE      support  xdocsdocs  jkstatus           native   README.txt  tools[root@BAIYU_175 tomcat-connectors-1.2.40-src]# cd native/    #native目录是要使用的连接器[root@BAIYU_175 native]# lsaclocal.m4  buildconf.sh  configure     iis          netscape    STATUS.txtapache-1.3  BUILDING.txt  configure.ac  Makefile.am  README.txt  TODO.txtapache-2.0  common        docs          Makefile.in  scripts[root@BAIYU_175 native]# less README.txt    #查看给的安装提示#看到其中有这么2行How do i build it?------------------Just take a look at BUILDING.txt[root@BAIYU_175 native]# lsaclocal.m4  buildconf.sh  configure     iis          netscape    STATUS.txtapache-1.3  BUILDING.txt  configure.ac  Makefile.am  README.txt  TODO.txtapache-2.0  common        docs          Makefile.in  scripts[root@BAIYU_175 native]# less BUILDING.txt#看到如下行 General Build Instructions  ==========================  To build tomcat-connectors you need to run "configure" and "make":  ./configure [autoconf arguments] [tomcat-connectors arguments]  make  It is possible to set CFLAGS and LDFLAGS to add some platform specifics:  LDFLAGS=-lc \  ./configure --with-apxs=/home2/local/apache/bin/apxs[root@BAIYU_175 native]# which apxs    #查看本机apxs命令的安装位置/usr/sbin/apxs[root@BAIYU_175 native]# ./configure --with-apxs=/usr/sbin/apxs[root@BAIYU_175 native]# make && make install[root@BAIYU_175 native]# ls /usr/lib64/httpd/modules/mod_jk.so   #确认一下/usr/lib64/httpd/modules/mod_jk.so

3)修改httpd配置文件装载jk_module模块

[root@BAIYU_175 native]# cd /etc/httpd/conf.d/[root@BAIYU_175 conf.d]# lsREADME  welcome.conf[root@BAIYU_175 conf.d]# vi mod_jd.conf  #这里使用一个专门的配置文件来保存相关指令及其设置。其内容如下:  1 LoadModule jk_module modules/mod_jk.so  2 JkWorkersFile /etc/httpd/conf.d/workers.properties #指定后端tomcat配置文件,随便    取名,不要以.cnf结尾即可  3 JkLogFile logs/mod_jk.log #jk_modules的日志  4 JkLogLevel info  5 JkMount /status ! #此路径不代理  6 JkMount /* TomcatB #/下内容全部代理至TomcatB  7 JkMount /status StatA #此路径由StatA响应,jk_modules自己提供[root@BAIYU_175 conf.d]# vi /etc/httpd/conf.d/workers.properties     1 worker.list=TomcatB,StatA  2 worker.TomcatB.host=192.168.200.180  3 worker.TomcatB.port=8009  4 worker.TomcatB.type=ajp13  5 worker.StatA.type=status[root@BAIYU_175 conf.d]# service httpd configtesthttpd: apr_sockaddr_info_get() failed for BAIYU_175httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerNameSyntax OK[root@BAIYU_175 conf.d]# service httpd reload重新载入 httpd:[root@BAIYU_175 conf.d]# httpd -M|grep jkhttpd: apr_sockaddr_info_get() failed for BAIYU_175httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName jk_module (shared)Syntax OK

测试:从浏览器访问192.168.200.175

wKiom1ZairKTraJrAABrSpnW6yE850.pngwKioL1ZaixTg6qTuAABid5tBeWE253.png

       除了需要使用LoadModule指令在apache中装载模块外,mod_jk还需要在apache的主配置文件中设置其它一些指令来配置其工作属。如JkWorkersFile则用于指定保存了worker相关工作属性定义的配置文件,JkLogFile则用于指定mod_jk模块的日志文件,JkLogLevel则可用于指定日志的级别(info, error, debug),此外还可以使用JkRequestLogFormat自定义日志信息格式。而JkMount(格式: JkMount <URL to match> <Tomcat worker name>)指定则用于控制URL与Tomcat workers的对应关系。 

      对于apache代理来说,每一个后端的Tomcat实例中的engine都可以视作一个worker,而每一个worker的地址、连接器的端口等信息都需要在apache端指定以便apache可以识别并使用这些worker约定俗成,配置这些信息的文件通常为workers.properties,其具体路径则是使用前面介绍过的JkWorkersFile指定的,在apache启动时,mod_jk会扫描此文件获取每一个worker的配置信息。比如,我们这里使用/etc/httpd/conf.d/workers.properties。

workers.properties文件一般由两类指令组成:

一是mod_jk可以连接的各worker名称列表,

二是每一个worker的属性配置信息。它们分别遵循如下使用语法。

worker.list = < a comma separated list of worker names >

worker. <worker name> .<property> = <property value>

其中worker.list指令可以重复指定多次,而worker name则是Tomcat中engine组件jvmRoute参数的值。如:

worker.TomcatA.host=192.168.100.179

根据其工作机制的不同,worker有多种不同的类型,这是需要为每个worker定义的一项属性woker.<work name>.type。常见的类型如下:

◇ ajp13:此类型表示当前worker为一个运行着的Tomcat实例。

◇ lb:lb即load balancing,专用于负载均衡场景中的woker;此worker并不真正负责处理用户请求,而是将用户请求调度给其它类型为ajp13的worker。

◇ status:用户显示分布式环境中各实际worker工作状态的特殊worker,它不处理任何请求,也不关联到任何实际工作的worker实例。具体示例如请参见后文中的配置。

worker其它常见的属性说明:

◇ host:Tomcat 7的worker实例所在的主机;

◇ port:Tomcat 7实例上AJP1.3连接器的端口;

◇ connection_pool_minsize:最少要保存在连接池中的连接的个数;默认为pool_size/2;

◇ connection_pool_timeout:连接池中连接的超时时长;

◇ mount:由当前worker提供的context路径,如果有多个则使用空格格开;此属性可以由JkMount指令替代;

◇ retries:错误发生时的重试次数;

◇ socket_timeout:mod_jk等待worker响应的时长,默认为0,即无限等待;

◇ socket_keepalive:是否启用keep alive的功能,1表示启用,0表示禁用;

◇ lbfactor:worker的权重,可以在负载均衡的应用场景中为worker定义此属性;

三、httpd基于jk_module模块实现tomcat Cluster负载均衡

1、部署node6上的tomcatA

  过程和上面的一样这里就不贴出来了,只是修改下测试页面

[root@BAIYU_179 ~]# cd /usr/local/tomcat/[root@BAIYU_179 tomcat]# lsbin   lib      logs    RELEASE-NOTES  temp     workconf  LICENSE  NOTICE  RUNNING.txt    webapps[root@BAIYU_179 tomcat]# cd webapps/[root@BAIYU_179 webapps]# lsdocs  examples  host-manager  index.jsp  manager  ROOT  testapp[root@BAIYU_179 webapps]# cd testapp/[root@BAIYU_179 testapp]# lsclasses  index.jsp  index.jsp.orig  lib  META-INF  WEB-INF[root@BAIYU_179 testapp]# vi index.jsp<%@ page language="java" %> TomcatA  

TomcatA 

 
    Session ID <% session.setAttribute("abc","abc"); %>  <%= session.getId() %>      Created on  <%= session.getCreationTime() %>    

测试:

wKiom1ZajOqzFsFYAABhGFcstT0486.png

2、修改node5上jk_module模块的配置信息

[root@BAIYU_175 conf.d]# ls  d_jd.conf       README        workers.propertiesmod_jd.conf.orig  welcome.conf  workers.properties.orig[root@BAIYU_175 conf.d]# vi mod_jd.conf  1 LoadModule jk_module modules/mod_jk.so  2 JkWorkersFile /etc/httpd/conf.d/workers.properties  3 JkLogFile logs/mod_jk.log  4 JkLogLevel info  5 JkMount /status !  6 JkMount /* tcsrvs          #只是修改了这行,把代理至后端单个tomcat改成后端一组tomcat  7 JkMount /status StatA[root@BAIYU_175 conf.d]# vi workers.properties  1 worker.list=tcsrvs,StatA  2 worker.TomcatB.host=192.168.200.180  3 worker.TomcatB.port=8009  4 worker.TomcatB.type=ajp13  5 worker.TomcatB.lbfactor=1  #权重,调度因子  6 worker.TomcatA.host=192.168.200.179  7 worker.TomcatA.port=8009  8 worker.TomcatA.type=ajp13  9 worker.TomcatA.lbfactor=1 10 worker.StatA.type=status 11 worker.tcsrvs.type=lb    # 12 worker.tcsrvs.balance_workers=TomcatA,TomcatB [root@BAIYU_175 conf.d]# service httpd configtesthttpd: apr_sockaddr_info_get() failed for BAIYU_175httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerNameSyntax OK[root@BAIYU_175 conf.d]# service httpd reload重新载入 httpd:

测试:

wKioL1ZaixTg6qTuAABid5tBeWE253.png

发现已经实现了轮询调度后面的TomcatA,TomcatB,如果不能轮询调度,可以启用了sticky_session,再在workers.properties配置文件中添加workstick.tcsrvs.sticky_session=0,不启用sticky_session.

在负载均衡模式中,专用的属性还有:

◇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。

3、jk_module的状态页面

在此页面可以查看到后端主机的状态,并修改他们的配置信息,

注意:生产环境中此页面不应该让人随意访问,做个访问控制咯

四、httpd基于proxy_module模块实现tomcat Cluster负载均衡

1、修改http的配置文件

[root@BAIYU_175 conf.d]# ls  d_jd.conf       README        workers.propertiesmod_jd.conf.orig  welcome.conf  workers.properties.orig[root@BAIYU_175 conf.d]# mv mod_jd.conf mod_jd.conf.bak[root@BAIYU_175 conf.d]# vi http-tomcat.conf  1 
  2    BalancerMember http://192.168.200.179:8080 loadfactor=1   #把协议改成ajp,和对应的端口8009也可  3    BalancerMember http://192.168.200.180:8080 loadfactor=1  4   5 NameVirtuaLHost *:80  6 
  7     ServerName www.a.com  8     ProxyVia on  9     ProxyRequests off  10     ProxypreserveHost ON 11   
 12        Order deny,allow 13        allow from all 14    15 16     ProxyPass / balancer://tcsrvs/ 17     ProxyPa***everse / balancer://tcsrvs/ 18   
 19        Order deny,allow 20        allow from all 21    22                        [root@BAIYU_175 conf.d]# service httpd configtesthttpd: apr_sockaddr_info_get() failed for BAIYU_175httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerNameSyntax OK[root@BAIYU_175 conf.d]# service httpd reload重新载入 httpd:

测试:也是成功的,这里就不上图了,,

如果Proxy指定是以balancer://开头,即用于负载均衡集群时,其还可以接受一些特殊的参数,如下所示:

◇lbmethod:apache实现负载均衡的调度方法,默认是byrequests,即基于权重将统计请求个数进行调度,bytraffic则执行基于权重的流量计数调度,bybusyness通过考量每个后端服务器的当前负载进行调度。

◇ maxattempts:放弃请求之前实现故障转移的次数,默认为1,其最大值不应该大于总的节点数。

◇ nofailover:取值为On或Off,设置为On时表示后端服务器故障时,用户的session将损坏;因此,在后端服务器不支持session复制时可将其设置为On。

◇ stickysession:调度器的sticky session的名字,根据web程序语言的不同,其值为JSESSIONID或PHPSESSIONID。

上述指令除了能在banlancer://或ProxyPass中设定之外,也可使用ProxySet指令直接进行设置,

如:

<Proxy balancer://hotcluster>

BalancerMember  http://www1.magedu.com:8080 loadfactor=1

BalancerMember  http://www2.magedu.com:8080 loadfactor=2

ProxySet  lbmethod=bytraffic

</Proxy>

ProxyPa***everse:用于让apache调整HTTP重定向响应报文中的Location、Content-Location及URI标签所对应的URL,在反向代理环境中必须使用此指令避免重定向报文绕过proxy服务器。

2、proxy_module模块的状态页面

[root@BAIYU_175 conf.d]# vi http-tomcat.conf   1 
  2    BalancerMember http://192.168.200.179:8080 loadfactor=1  3    BalancerMember http://192.168.200.180:8080 loadfactor=1  4   5 NameVirtuaLHost *:80  6 
  7     ServerName www.a.com  8     ProxyVia on  9     ProxyRequests off 10     ProxypreserveHost ON 11   
 12        Order deny,allow 13        allow from all 14    15     ProxyPass /balancer-manager ! 16     ProxyPass / balancer://tcsrvs/ 17     ProxyPa***everse / balancer://tcsrvs/ 18   
 19        Order deny,allow 20        allow from all 21    22 #用于mod_proxy状态信息的输出 23 
 24   SetHandler balancer-manager 25   Proxypass ! 26   Order Deny,Allow 27   Allow from all 28  29 

五、Tomcat的会话管理器 

1、Manager组件 

Manger对象用于实现HTTP会话管理的功能,Tomcat中有5种Manger的实现: 

(1).StandardManager 
    Tomcat的默认会话管理器,用于非集群环境中对单个处于运行状态的Tomcat实例会话进行管理。当Tomcat关闭时,这些会话相关的数据会被写入磁盘上的一个名叫SESSION.ser的文件,并在Tomcat下次启动时读取此文件。 

<Manager className="org.apache.catalina.session.StandardManager"

         maxInactiveInterval="7200"/>

默认保存于$CATALINA_HOME/work/Catalina/<hostname>/<webapp-name>/下的SESSIONS.ser文件中。

maxActiveSessions:最多允许的活动会话数量,默认为-1,表示不限制; 

maxInactiveInterval:非活动的会话超时时长,默认为60s;

pathname:会话文件的保存目录;

服务器重启会话信息可能会丢失,

(2).PersistentManager 

当一个会话长时间处于空闲状态时会被写入到swap会话对象,这对于内存资源比较吃紧的应用环境来说比较有用。 

将会话数据保存至持久存储中,并且能在服务器意外中止后重新启动时重新加载这些会话信息。持久会话管理器支持将会话保存至文件存储(FileStore)或JDBC存储(JDBCStore)中。

保存至文件中的示例:

<Manager className="org.apache.catalina.session.PersistentManager"

  saveOnRestart="true">

  <Store className="org.apache.catalina.session.FileStore"

    directory="/data/tomcat-sessions"/>

</Manager>

每个用户的会话会被保存至directory指定的目录中的文件中,文件名为<session id>.session,并通过后台线程每隔一段时间(checkInterval参数定义,默认为60秒)检查一次超时会话。

保存至JDBCStore中的示例:

<Manager className="org.apache.catalina.session.PersistentManager"

  saveOnRestart="true">

  <Store className="org.apache.catalina.session.JDBCStore"

    driverName="com.mysql.jdbc.Driver"

    connectionURL="jdbc:mysql://localhost:3306/mydb?user=jb;password=pw"/>

</Manager>

(3).DeltaManager (session多播复制)

用于Tomcat集群的会话管理器,它通过将改变了会话数据同步给集群中的其它节点实现会话复制。这种实现会将所有会话的改变同步给集群中的每一个节点,也是在集群环境中用得最多的一种实现方式。 
(4).BackupManager(两两备份,拓扑困难)
用于Tomcat集群的会话管理器,与DeltaManager不同的是,某节点会话的改变只会同步给集群中的另一个而非所有节点。 

1,2我感觉有错误吧,混了,但这里不管了,一般只用到DeltaManager,这种方式网络资源消耗过大,也只适合3-5个节点的集群,

2、基于DeltaManager实现seession复制

 1)修改tomcat的配置文件server.xml

 
   
     
         
                                         
 
 
                                                                                    
  
         
 
 

以上内容定义在Engine容器中,则表示对所有主机均启动用集群功能。如果定义在某Host中,则表示仅对此主机启用集群功能。(注,tomcatA与tomcatB都要修改!)

2)在web.xml文件中添加<distributable\>

 此外,所有启用集群功能的web应用程序,其web.xml中都须添加<distributable/>才能实现集群功能。如果某web应用程序没有自己的web.xml,也可以通过复制默认的web.xml至其WEB-INF目录中实现。

[root@BAIYU_179 conf]# lsCatalina             context.xml         server.xml.bak    tomcat-users.xml.origcatalina.policy      logging.properties  server.xml.orig   tomcat-users.xsdcatalina.properties  server.xml          tomcat-users.xml  web.xml[root@BAIYU_179 conf]# cd ..[root@BAIYU_179 tomcat]# lsbin  conf  lib  LICENSE  logs  NOTICE  RELEASE-NOTES  RUNNING.txt  temp  webapps  work[root@BAIYU_179 tomcat]# cd webapps/[root@BAIYU_179 webapps]# lsdocs  examples  host-manager  manager  ROOT  testapp[root@BAIYU_179 webapps]# cd testapp/[root@BAIYU_179 testapp]# lsclasses  index.jsp  index.jsp.orig  lib  META-INF  WEB-INF[root@BAIYU_179 testapp]# cp /usr/local/tomcat/conf/web.xml . [root@BAIYU_179 testapp]# vi web.xml 
                  #添加该行

测试:

wKiom1Za9sSDrl2yAABkmCQCzW0740.png

可以从图中看到,不管你怎么刷新Session ID都不会变,说明我们的Tomcat的DeltaManager集群配置完成,实现了多台主机之间会话共享。

总结:构建DeltaManager集群步骤:

  1、在各节点的server.xml的engine或host容器添加如上内容;

注意修改MemberShip组件中的多播地址address="228.0.0.4",建议修改Receiver中的address为本机能够传递心跳信息的地址;

 2、在各节点为使用组播地址添加组播路由,格式:

    route add -net $MCAST_ADDRESS netmask 255.255.255.255 dev eth0

 3、在相应应用程序的web.xml中添加<distributable/>;