Apache反向代理Tomcat集群,以及session复制

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
日志服务 SLS,月写入数据量 50GB 1个月
简介:

一、Apache反向代理介绍

Apache可以通过mod_jk和mod_proxy模块跟Tomcat整合,mod_proxy只能在apache 2.2.x系列的版本才能直接提供,它可以提供更丰富的功能和安全性;而对于apache1.3.x和2.0.x来说mod_jk才更合适,这俩种方式都可以使用tomcat内置的ajp和http类型的连接器来实现apache代理tomcat集群。


二、实验的环境:

192.168.30.116 OS:Centos6.4 x86_64  apache.luojianlong.com

192.168.30.117 OS:Centos6.4 x86_64  TomcatA.luojianlong.com

192.168.30.119 OS:Centos6.4 x86_64  TomcatB.luojianlong.com

Apache versrion: httpd-2.4.6

Tomcat version: apache-tomcat-7.0.53

拓扑图如下:

wKiom1M-ZE2Qtr1lAAD2vuIjNuQ819.jpg


三、使用apache的mod_jk来实现反向代理

首先在apache.luojianlong.com上编译安装apache


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
39
40
41
42
43
44
45
46
# 安装apr和apr-util
[root@apache ~] # tar xvf apr-1.4.6.tar.bz2
[root@apache ~] # cd apr-1.4.6
[root@apache apr-1.4.6] # ./configure --prefix=/usr/local/apr --disable-ipv6
# 如果报错rm: cannot remove `libtoolT': No such file or directory
# 直接打开 configure,把 $RM “$cfgfile” 那行删除掉,重新再运行
# ./configure 就可以了
[root@apache apr-1.4.6] # make && make install
[root@apache ~] # tar xvf apr-util-1.5.2.tar.bz2
[root@apache ~] # cd apr-util-1.5.2
[root@apache apr-util-1.5.2] # ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@apache apr-util-1.5.2] # make && make install
# 安装apache
[root@apache ~] # tar xvf httpd-2.4.6.tar.bz2
[root@apache ~] # cd httpd-2.4.6
[root@apache httpd-2.4.6] # ./configure --prefix=/usr/local/apache \
> --sysconfdir= /etc/httpd  \
> -- enable -so \
> -- enable -ssl \
> -- enable -cgi \
> -- enable -rewrite \
> --with-zlib \
> --with-pcre \
> --with-apr= /usr/local/apr  \
> --with-apr-util= /usr/local/apr-util  \
> -- enable -mpms-shared=all \
> --with-mpm=event \
> -- enable -proxy \
> -- enable -proxy-http \
> -- enable -proxy-ajp \
> -- enable -proxy-balancer \
> -- enable -lbmethod-heartbeat \
> -- enable -heartbeat \
> -- enable -slotmem-shm \
> -- enable -slotmem-plain \
> -- enable -watchdog
[root@apache httpd-2.4.6] # make && make install
[root@apache ~] # vi /etc/httpd/httpd.conf
# 编辑配置文件取消下面的这一行的注释
LoadModule slotmem_shm_module modules /mod_slotmem_shm .so
[root@apache ~] # /usr/local/apache/bin/apachectl start
[root@apache ~] # ps aux | grep apache
root     18345  0.0  0.0 105796  2336 ?        Ss   16:59   0:00  /usr/local/apache/bin/httpd  -k start
daemon   18346  0.2  0.1 450056  4384 ?        Sl   16:59   0:00  /usr/local/apache/bin/httpd  -k start
daemon   18347  0.0  0.1 450056  4384 ?        Sl   16:59   0:00  /usr/local/apache/bin/httpd  -k start
daemon   18348  0.2  0.1 450056  4392 ?        Sl   16:59   0:00  /usr/local/apache/bin/httpd  -k start


在2台tomcat上面安装tomcat


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
# 首先安装配置jdk环境
[root@TomcatA ~] # tar zxvf jdk-7u25-linux-x64.gz -C /usr/local/
[root@TomcatA  local ] # ln -s jdk1.7.0_25 jdk
[root@TomcatA ~] # vi /etc/profile.d/jdk.sh
export  JAVA_HOME= /usr/local/jdk
export  CLASSPATH=$CLASSPATH:$JAVA_HOME /lib :$JAVA_HOME /jre/lib
export  PATH= /usr/local/jdk/bin :$PATH
[root@TomcatA ~] # . /etc/profile.d/jdk.sh
[root@TomcatA ~] # java -version
java version  "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)
# 安装配置tomcat
[root@TomcatA ~] # tar zxvf apache-tomcat-7.0.53.tar.gz -C /usr/local/
[root@TomcatA ~] # cd /usr/local/
[root@TomcatA  local ] # ln -s apache-tomcat-7.0.53 tomcat
[root@TomcatA ~] # vi /etc/profile.d/tomcat.sh
export  CATALINA_HOME= /usr/local/tomcat
export  PATH= /usr/local/tomcat/bin :$PATH
[root@TomcatA ~] # . /etc/profile.d/tomcat.sh
[root@TomcatA ~] # catalina.sh start
Using CATALINA_BASE:    /usr/local/tomcat
Using CATALINA_HOME:    /usr/local/tomcat
Using CATALINA_TMPDIR:  /usr/local/tomcat/temp
Using JRE_HOME:         /usr/local/jdk
Using CLASSPATH:        /usr/local/tomcat/bin/bootstrap .jar: /usr/local/tomcat/bin/tomcat-juli .jar
Tomcat started.
[root@TomcatA ~] # jps
18724 Bootstrap
18744 Jps
[root@TomcatA ~] # ss -antpl | grep :8080
LISTEN     0      100                      :::8080                    :::*       users :(( "java" ,18724,42))
[root@TomcatA ~] # scp -pr jdk-7u25-linux-x64.gz apache-tomcat-7.0.53.tar.gz root@192.168.30.119:/root/
# TomcatB上同样上面的步骤安装jdk和tomcat


访问都正常


1
2
3
4
5
6
7
8
9
10
11
12
[root@TomcatA ~] # curl -I http://192.168.30.117:8080
HTTP /1 .1 200 OK
Server: Apache-Coyote /1 .1
Content-Type: text /html ;charset=ISO-8859-1
Transfer-Encoding: chunked
Date: Fri, 04 Apr 2014 09:35:50 GMT
[root@TomcatA ~] # curl -I http://192.168.30.119:8080
HTTP /1 .1 200 OK
Server: Apache-Coyote /1 .1
Content-Type: text /html ;charset=ISO-8859-1
Transfer-Encoding: chunked
Date: Fri, 04 Apr 2014 09:36:45 GMT


配置基于mod_jk的负载均衡

修改Tomcat配置文件,添加Host标签,创建项目加载的类库文件夹,并为每一个Tomcat实例的引擎添加jvmRoute参数,并通过其为当前引擎设置全局惟一标识符,需要注意的是,每一个实例的jvmRoute的值均不能相同。


1
2
3
4
5
6
7
8
9
10
11
12
13
# 为每一个Tomcat实例的引擎添加jvmRoute参数,并通过其为当前引擎设置全局惟一标识符,需要注意的是,每一个实例的jvmRoute的值均不能相同。
[root@TomcatA ~] # vi /usr/local/tomcat/conf/server.xml
# 添加以下内容
   <Engine name= "Catalina"  defaultHost= "192.168.30.117"  jvmRoute= "TomcatA" >
   <Host name= "192.168.30.117"   appBase= "/tomcat/web"
             unpackWARs= "true"  autoDeploy= "true" >
   <Context path= ""  docBase= "/tomcat/web" />
        <Valve className= "org.apache.catalina.valves.AccessLogValve"  directory= "logs"
                prefix= "www_access_log."  suffix= ".txt"
                pattern= "%h %l %u %t &quot;%r&quot; %s %b"  />
       < /Host >
[root@TomcatA ~] # mkdir /tomcat/web/WEB-INF/classes -p
[root@TomcatA ~] # mkdir /tomcat/web/WEB-INF/lib -p



为了方便后面的测试,为2台服务器分别建立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
39
40
41
42
43
44
45
46
47
48
49
50
51
[root@TomcatA ~] # cd /tomcat/web/
[root@TomcatA web] # vi index.jsp
<%@ page language= "java"  %>
<html>
   < head ><title>TomcatA< /title >< /head >
   <body>
     <h1><font color= "red" >TomcatA < /font >< /h1 >
     <table align= "centre"  border= "1" >
       < tr >
         <td>Session ID< /td >
     <% session.setAttribute( "abc" , "abc" ); %>
         <td><%= session.getId() %>< /td >
       < /tr >
       < tr >
         <td>Created on< /td >
         <td><%= session.getCreationTime() %>< /td >
      < /tr >
     < /table >
   < /body >
< /html >
[root@TomcatA ~] # catalina.sh stop
Using CATALINA_BASE:    /usr/local/tomcat
Using CATALINA_HOME:    /usr/local/tomcat
Using CATALINA_TMPDIR:  /usr/local/tomcat/temp
Using JRE_HOME:         /usr/local/jdk
Using CLASSPATH:        /usr/local/tomcat/bin/bootstrap .jar: /usr/local/tomcat/bin/tomcat-juli .jar
[root@TomcatA ~] # catalina.sh start
Using CATALINA_BASE:    /usr/local/tomcat
Using CATALINA_HOME:    /usr/local/tomcat
Using CATALINA_TMPDIR:  /usr/local/tomcat/temp
Using JRE_HOME:         /usr/local/jdk
Using CLASSPATH:        /usr/local/tomcat/bin/bootstrap .jar: /usr/local/tomcat/bin/tomcat-juli .jar
Tomcat started.
[root@TomcatA ~] # curl http://192.168.30.117:8080/index.jsp
<html>
   < head ><title>TomcatA< /title >< /head >
   <body>
     <h1><font color= "red" >TomcatA < /font >< /h1 >
     <table align= "centre"  border= "1" >
       < tr >
         <td>Session ID< /td >
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
         <td>AB5025287773B482327CF6F5D982389F.TomcatA< /td >
       < /tr >
       < tr >
         <td>Created on< /td >
         <td>1396605416275< /td >
      < /tr >
     < /table >
   < /body >
< /html >



将配置文件和项目目录发送到TomcatB服务器,然后修改



1
2
3
4
5
[root@TomcatA ~] # scp -pr /usr/local/tomcat/conf/server.xml root@192.168.30.119:/usr/local/tomcat/conf/
[root@TomcatA ~] # scp -pr /tomcat/ root@192.168.30.119:/
[root@TomcatB ~] # cd /usr/local/tomcat/conf/
[root@TomcatB conf] # vi server.xml
# 将Engine标签中的defaulthost的值改为192.168.30.119,jvmRoute的值改为TomcatB,Host标签中的name的值改为192.168.30.119,jvmRoute的值改为TomcatB



为TomcatB建立测试页面



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
39
40
41
42
43
44
45
46
47
48
49
50
51
[root@TomcatB ~] # cd /tomcat/web/
[root@TomcatB web] # vi index.jsp
<%@ page language= "java"  %>
<html>
   < head ><title>TomcatB< /title >< /head >
   <body>
     <h1><font color= "blue" >TomcatB < /font >< /h1 >
     <table align= "centre"  border= "1" >
       < tr >
         <td>Session ID< /td >
     <% session.setAttribute( "abc" , "abc" ); %>
         <td><%= session.getId() %>< /td >
       < /tr >
       < tr >
         <td>Created on< /td >
         <td><%= session.getCreationTime() %>< /td >
      < /tr >
     < /table >
   < /body >
< /html >
[root@TomcatB ~] # catalina.sh stop
Using CATALINA_BASE:    /usr/local/tomcat
Using CATALINA_HOME:    /usr/local/tomcat
Using CATALINA_TMPDIR:  /usr/local/tomcat/temp
Using JRE_HOME:         /usr/local/jdk
Using CLASSPATH:        /usr/local/tomcat/bin/bootstrap .jar: /usr/local/tomcat/bin/tomcat-juli .jar
[root@TomcatB ~] # catalina.sh start
Using CATALINA_BASE:    /usr/local/tomcat
Using CATALINA_HOME:    /usr/local/tomcat
Using CATALINA_TMPDIR:  /usr/local/tomcat/temp
Using JRE_HOME:         /usr/local/jdk
Using CLASSPATH:        /usr/local/tomcat/bin/bootstrap .jar: /usr/local/tomcat/bin/tomcat-juli .jar
Tomcat started.
[root@TomcatB ~] # curl http://192.168.30.119:8080/index.jsp
<html>
   < head ><title>TomcatB< /title >< /head >
   <body>
     <h1><font color= "blue" >TomcatB < /font >< /h1 >
     <table align= "centre"  border= "1" >
       < tr >
         <td>Session ID< /td >
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
         <td>9F9DAF404E0EDDE92AD63400A4ED8283.TomcatA< /td >
       < /tr >
       < tr >
         <td>Created on< /td >
         <td>1396605796342< /td >
      < /tr >
     < /table >
   < /body >
< /html >


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


1
2
3
4
[root@apache ~] # tar zxvf tomcat-connectors-1.2.37-src.tar.gz
[root@apache ~] # cd tomcat-connectors-1.2.37-src/native
[root@apache native] # ./configure --with-apxs=/usr/local/apache/bin/apxs
[root@apache native] # make && make install


apache要使用mod_jk连接器,需要在启动时加载此连接器模块,为了便于管理与mod_jk模块相关的配置,这里使用一个专门的配置文件/etc/httpd/extra/httpd-jk.conf来保存相关指令及其设置。其内容如下: