一、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
拓扑图如下:
三、使用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 "%r" %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来保存相关指令及其设置。其内容如下: