Apache Tomcat 整合集群 session 共享

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

Apache Tomcat 整合集群

所需软件

1
2
3
4
5
6
7
CentOS6.5 64
Apache2.2.15
Tomcat7.0.62
JDK 1.8.0_45
tomcat-connectors 1.2.40
MySQL<可选>
PHP<可选>

一   安装
A服务器安装  IP  192.168.150.7

1
2
3
4
5
apache php mysql
yum  install  httpd httpd-devel php php-devel php-gd php-mysql php-mbstring mysql mysql-devel  mysql-server mysql-libs
service httpd start   // 启动HTTPD
service mysqld start  // 启动MYSQL
/usr/bin/mysqladmin  -u root password  'new-password'  // 修改MYSQL密码
1
2
3
java & jdk
yum list java*
yum  install  java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64 java-1.8.0-openjdk-headless.x86_64

装完之后测试java javac命令是否可用 并查看版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@serv ~] # java -version
openjdk version  "1.8.0_45"
OpenJDK Runtime Environment (build 1.8.0_45-b13)
OpenJDK 64-Bit Server VM (build 25.45-b02, mixed mode)
[root@serv ~]
 
tomcat  tomcat-connectors
cd  /usr/local
wget http: //mirrors .cnnic.cn /apache/tomcat/tomcat-7/v7 .0.62 /bin/apache-tomcat-7 .0.62. tar .gz
wget http: //apache .dataguru.cn /tomcat/tomcat-connectors/jk/tomcat-connectors-1 .2.40-src. tar .gz
 
tar  xvzf apache-tomcat-7.0.62. tar .gz
mv  apache-tomcat-7.0.62 tomcat
tar  xvzf tomcat-connectors-1.2.40-src. tar .gz
cd  tomcat-connectors-1.2.40-src
cd  native
. /configure  --with-apxs= /usr/sbin/apxs
make
cd  apache-2.0/
cp  mod_jk.so  /etc/httpd/modules

B服务器安装  IP 192.168.150.8

1
2
3
4
5
6
7
yum list java*
yum  install  java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64 java-1.8.0-openjdk-headless.x86_64
 
cd  /usr/local
wget http: //mirrors .cnnic.cn /apache/tomcat/tomcat-7/v7 .0.62 /bin/apache-tomcat-7 .0.62. tar .gz
tar  xvzf apache-tomcat-7.0.62. tar .gz
mv  apache-tomcat-7.0.62 tomcat

二 配置
A服务器 IP  192.168.150.7
先配置HTTP服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
cd  /etc/httpd/conf
touch  mod_jk.conf  // 新建mod_jk.conf文件  注意要在 /etc/httpd/conf 目录新建
vi  mod_jk.conf // 编辑mod_jk.conf文件 并加入以下内容 后保存退出
 
LoadModule jk_module  /etc/httpd/modules/mod_jk .so
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat  "%w %V %T"
JkWorkersFile  /etc/httpd/conf/workers .properties
JkMount /*.jsp controller
JkMount /*. do  controller
JkMount /*.jar controller
JkMount /*.class controller
JkMount  /application/ * controller
JkMount /* /servlet/ * controller
 
touch  workers.properties // 新建workers.properties文件 注意 要在 /etc/httpd/conf 目录新建
vi  workers.properties // 编辑workers.properties文件 并加入以下内容 后保存退出
 
workers.tomcat_home= /usr/local/tomcat    //tomcat 安装目录
worker.list=controller,tomcat1,tomcat2  // 集群的tomcat服务器 后面会说
#========tomcat1========   //第一台Tomcat设置
worker.tomcat1.port=8009               //AJP 端口 默认8009无需修改 因为我们的实验在不通的服务器
worker.tomcat1.host=localhost         //IP 地址 本机无需修改
worker.tomcat1. type =ajp13
worker.tomcat1.lbfactor=1                // 轮训次数  越大越多
 
#========tomcat2========
worker.tomcat2.port=8009                 // 第二台Tomcat设置
worker.tomcat2.host=192.168.150.8   // 第二台TomcatIP  因我们的TOMCAT在另一台服务器上 要写IP地址
worker.tomcat2. type =ajp13
worker.tomcat2.lbfactor=1
 
 
worker.controller. type =lb
worker.controller.balance_workers=tomcat1,tomcat2   // 轮训的tomcat列表
worker.controller.sticky_session=0
worker.controller.sticky_session_force=0
worker.jkstatus. type =status

然后修改httpd.conf文件 
修改一下ServerName 
在末尾加入

1
Include conf /mod_jk .conf

tomcat  session配置  192.168.150.7  192.168.150.8 都做相同配置

1
cd  /usr/local/tomcat/conf

注意修改之前备份一下源文件 

1
2
cp   server.xml  server.xml.bak
vi  server.xml

1
<!-- Engine name="Catalina" defaultHost="localhost" -->

修改为

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

在<Engine> 节点中加入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
< Cluster  className = "org.apache.catalina.ha.tcp.SimpleTcpCluster"
          channelSendOptions = "8" >
 
   < 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 = "224.0.0.0"
                 port = "45564"
                 frequency = "500"
                 dropTime = "3000" />
     < Receiver  className = "org.apache.catalina.tribes.transport.nio.NioReceiver"
               address = "192.168.150.7"
               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 = ".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;" />
   < 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 >

在Host节点加入以下内容

1
2
3
4
5
< Deployer  className = "org.apache.catalina.ha.deploy.FarmWarDeployer"
           tempDir = "/tmp/war-temp/"
           deployDir = "/tmp/war-deploy/"
           watchDir = "/tmp/war-listen/"
           watchEnabled = "false" />

注意在B服务器上 也就是192.168.150.8 以上加的内容 其中

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

这一行tomcat1修改为tomcat2

1
2
3
4
5
6
     < Receiver  className = "org.apache.catalina.tribes.transport.nio.NioReceiver"
               address = "192.168.150.7"   //这里修改为 B机器的IP地址  192.168.150.8
               port = "4000"   //  这里第一台服务器不用修改  150.8修改为4001
               autoBind = "100"
               selectorTimeout = "5000"
               maxThreads = "6" />

至此集群和session恭喜基本配置完成 下面我们做测试

在两台服务器上分别新建如果先文件

1
2
3
4
cd  /usr/local/tomcat/webapps
mkdir  test
cd  test
touch  index.jsp  // 新建index.jsp文件 并加入如下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
  <b>当前SessionID:</b>   
<br />   
<%   
         String sessionID = session.getId();   
         out.println(sessionID);   
         System.err.println( "sessionID = "  + sessionID);   
   
         // 如果有新的 Session 属性设置   
         String dataName = request.getParameter( "dataName" );   
         if  (dataName !=  null  && !dataName.isEmpty()) {   
                 String dataValue = request.getParameter( "dataValue" );   
                 session.setAttribute(dataName, dataValue);   
         }   
%>   
<br />   
<br />   
<b>Session属性列表:</b>   
   
<br />   
<%   
         Enumeration<String> e = (Enumeration<String>) session   
                         .getAttributeNames();   
         while  (e.hasMoreElements()) {   
                 String name = e.nextElement();   
                 String value = (String) session.getAttribute(name);   
                 out.println(name +  " = "  + value +  "<br>" );   
                 System.err.println(name +  " = "  + value);   
         }   
%>   
<form method= "POST" >   
<ul style= "list-style-type: none;" >   
         <li><label  for = "dataName" >键:</label><input size= "20"  id= "dataName"  
                 name= "dataName" ></li>   
         <li><label  for = "dataValue" >值:</label><input size= "20"  
                 id= "dataValue"  name= "dataValue" ></li>   
         <li><input type= "submit"  value= "提交"  /></li>   
</ul>   
</form>
1
2
3
mkdir  WEB-INF   // 新建WEB-INFI文件夹
cd  WEB-INF  
touch  web.xml   // 新建web.xml文件 并加入以下内容
1
2
3
4
5
6
7
< web-app  xmlns = "http://java.sun.com/xml/ns/j2ee"
     xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation = "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >"
     version="2.4">
      < distributable />
      < display-name >TomcatDemo</ display-name >
</ web-app >

注意<distributable/>  这一句一定要加 不然session无法共享

还有注意

1
2
3
4
5
     < Membership  className = "org.apache.catalina.tribes.membership.McastService"
                 address = "224.0.0.0"
                 port = "45564"
                 frequency = "500"
                 dropTime = "3000" />

上面server.xml文件里的这句配置里的 address="224.0.0.0"

对于windows系统,广播地址(这里用到224.0.0.0和240.0.0.0)默认开放,
对于linux则需要通过命令开放地址。

1
route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0

然后通过route -v命令查看

1
2
3
4
5
6
7
[root@serv WEB-INF] # route -v
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.150.0   *               255.255.255.0   U     0      0        0 eth0
link- local       *               255.255.0.0     U     1002   0        0 eth0
224.0.0.0       *               240.0.0.0       U     0      0        0 eth0    // 已经有了
default         192.168.150.1   0.0.0.0         UG    0      0        0 eth0

这句最好加到/etc/rc.d/rc.local文件里面开机启动

以上内容两台服务器设置完成之后我们回到192.168.150.7 A服务器上
把刚才/usr/local/tomcat/webapps/test目录 复制到Apache的根目录

1
cp  -R  /usr/local/tomcat/webapps/test   /var/www/html    // 不复制也行

复制完成之后我们启动服务器
A服务器

1
2
3
service httpd restart
cd  /usr/local/tomcat/bin
. /startup .sh

B服务器