Tomcat系列之Apache使用mod_proxy和mod_jk反向代理Tomcat

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介:

大纲

一、环境准备

二、Apache使用mod_proxy反向代理Tomcat

三、Apache使用mod_jk反向代理Tomcat

注,环境说明:操作系统CnetOS6.4 x86_64,博客中所用到的所有软件请到这里下载:http://yunpan.cn/QGBCLwrZnpLMS。(所有软件版本都是目前最新版)


一、环境准备

1.实验拓扑

proxy

2.同步各节点时间

1
2
[root@apache ~] # ntpdate 202.120.2.101
[root@tomcat1 ~] # ntpdate 202.120.2.101

3.安装apr

1
2
3
4
[root@apache src] # tar xf apr-1.4.8.tar.gz
[root@apache src] # cd apr-1.4.8
[root@apache apr-1.4.8] # ./configure --prefix=/usr/local/apr --disable-ipv6
[root@apache apr-1.4.8] # make && make install

注,APR(Apache portable Run-time libraries,Apache可移植运行库)的目的如其名称一样,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。可以从http://apr.apache.org/获取apr源码,目前最新的版本是1.4.8。

4.安装apr-util

1
2
3
4
[root@apache src] # tar xf apr-util-1.5.2.tar.gz
[root@apache src] # 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

注,apr-util是apr的工具库,其可以让程序员更好的使用apr的功能。可以从http://apr.apache.org/获取apr源码,目前最新的版本是1.5.2。

5.安装httpd

注,httpd目前最新的2.4系列版本中引入了event MPM,其在性能上较之其它MPM有了较大的提升。

先解决依赖关系,

1
[root@apache httpd-2.4.6] # yum install -y pcre-devel openssl-devel

下面来编译安装httpd,

1
2
3
4
[root@apache src] # tar xf httpd-2.4.6.tar.gz
[root@apache src] # 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

为apache提供init脚本,实现服务的控制。建立/etc/rc.d/init.d/httpd文件,并添加如下内容:

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
[root@apache httpd-2.4.6] # vim /etc/rc.d/init.d/httpd
#!/bin/bash
#
# httpd  Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: Apache is a World Wide Web server. It is used to serve \
#   HTML files and CGI.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd.pid
# Source function library.
/etc/rc .d /init .d /functions
if  [ -f  /etc/sysconfig/httpd  ];  then
   /etc/sysconfig/httpd
fi
# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG- "C" }
# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS= ""
# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
# with the thread-based "worker" MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM; notably PHP will refuse to start.
# Path to the apachectl script, server binary, and short-form for messages.
apachectl= /usr/local/apache/bin/apachectl
httpd=${HTTPD- /usr/local/apache/bin/httpd }
prog=httpd
pidfile=${PIDFILE- /var/run/httpd .pid}
lockfile=${LOCKFILE- /var/lock/subsys/httpd }
RETVAL=0
start() {
   echo  -n $ "Starting $prog: "
   LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
   RETVAL=$?
   echo
   [ $RETVAL = 0 ] &&  touch  ${lockfile}
   return  $RETVAL
}
stop() {
  echo  -n $ "Stopping $prog: "
  killproc -p ${pidfile} -d 10 $httpd
  RETVAL=$?
  echo
  [ $RETVAL = 0 ] &&  rm  -f ${lockfile} ${pidfile}
}
reload() {
  echo  -n $ "Reloading $prog: "
  if  ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >& /dev/null then
   RETVAL=$?
   echo  $ "not reloading due to configuration syntax error"
   failure $ "not reloading $httpd due to configuration syntax error"
  else
   killproc -p ${pidfile} $httpd -HUP
   RETVAL=$?
  fi
  echo
}
# See how we were called.
case  "$1"  in
  start)
  start
  ;;
  stop)
  stop
  ;;
  status)
   status -p ${pidfile} $httpd
  RETVAL=$?
  ;;
  restart)
  stop
  start
  ;;
  condrestart)
  if  [ -f ${pidfile} ] ;  then
   stop
   start
  fi
  ;;
  reload)
   reload
  ;;
  graceful|help|configtest|fullstatus)
  $apachectl $@
  RETVAL=$?
  ;;
  *)
  echo  $ "Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"
  exit  1
esac
exit  $RETVAL

这是个脚本文件,因此需要执行权限;同时,为了让httpd服务能够开机自动启动,还需要将其添加至服务列表,并设置其在3或5级别下自动运行。

1
2
3
[root@apache httpd-2.4.6] # chmod +x /etc/rc.d/init.d/httpd
[root@apache httpd-2.4.6] # chkconfig --add httpd
[root@apache httpd-2.4.6] # chkconfig --level 35 httpd on

下面我们简单修改一下配置文件,(如下图所示在配置文件中增加一行PidFile并启动两模块)

pid

mode

接下来检查一下配置文件并启动,

1
2
3
4
5
6
[root@apache httpd] # service httpd configtest
Syntax OK
[root@apache httpd] # service httpd start
正在启动 httpd:           [确定]
[root@apache httpd] # netstat -ntulp | grep :80
tcp  0  0 0.0.0.0:80     0.0.0.0:*     LISTEN  32905 /httpd

下面我们来访问测试一下

it works

好了,到这里我们httpd就全部安装完成了,下面我们来安装一下tomcat。

6.安装jdk

直接用rpm安装即可,

1
[root@tomcat1 src] # rpm -ivh jdk-7u40-linux-x64.rpm

增加一下环境变量,

1
2
3
[root@tomcat tomcat] # cat /etc/profile.d/java.sh
export  JAVA_HOME= /usr/java/jdk1 .7.0_40
export  PATH=$PATH:$JAVA_HOME /bin

下面来测试一下,

1
2
3
4
[root@tomcat1 java] # java -version
java version  "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)

好了,到这里我们jdk就安装完成了,下面我们来安装tomcat。

7.安装tomcat

先将tomcat解压到/usr/local下,

1
2
[root@tomcat1 src] # tar xf apache-tomcat-7.0.42.tar.gz -C /usr/local/
[root@tomcat1 src] # cd /usr/local/

下面来为tomcat创建软链接,

1
2
3
4
[root@tomcat1  local ] # ln -sv apache-tomcat-7.0.42 tomcat
"tomcat"  ->  "apache-tomcat-7.0.42"
[root@tomcat1  local ] # ls
apache-tomcat-7.0.42 bin etc games include lib lib64 libexec sbin share src tomcat

接下来我们来配置一下环境变量,

1
2
3
[root@tomcat tomcat] # cat /etc/profile.d/tomcat.sh
export  CATALINA_HOME= /usr/local/tomcat
export  PATH=$PATH:$CATALINA_HOME /bin

下面我们来查看一下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@tomcat1 ~] # catalina.sh version
Using CATALINA_BASE:  /usr/local/tomcat
Using CATALINA_HOME:  /usr/local/tomcat
Using CATALINA_TMPDIR:  /usr/local/tomcat/temp
Using JRE_HOME:   /usr/java/jdk1 .7.0_40
Using CLASSPATH:   /usr/local/tomcat/bin/bootstrap .jar: /usr/local/tomcat/bin/tomcat-juli .jar
Server version: Apache Tomcat /7 .0.42
Server built: Jul 2 2013 08:57:41
Server number: 7.0.42.0
OS Name:  Linux
OS Version:  2.6.32-358.el6.x86_64
Architecture: amd64
JVM Version: 1.7.0_40-b43
JVM Vendor:  Oracle Corporation

为了方便对tomcat的管理,我们为tomcat增加init脚本,

1
2
3
4
5
6
7
8
9
10
[root@tomcat ~] # vim /etc/init.d/tomcat
#!/bin/sh
# Tomcat init script for Linux.
#
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
CATALINA_HOME= /usr/local/tomcat  #注意你的脚本路径
export  CATALINA_HOME
# export CATALINA_OPTS="-Xms128m -Xmx256m"
exec  $CATALINA_HOME /bin/catalina .sh $*

下面我们来增加执行权限,并加入服务列表设置开机自启动,

1
2
3
4
[root@tomcat ~] # chmod +x /etc/init.d/tomcat
[root@tomcat ~] # chkconfig --add tomcat
[root@tomcat ~] # chkconfig tomcat --list
tomcat 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭

下面我们来启动一下Tomcat并测试一下,

1
2
3
4
5
6
[root@tomcat ~] # service tomcat start
Using CATALINA_BASE:  /usr/local/tomcat
Using CATALINA_HOME:  /usr/local/tomcat
Using CATALINA_TMPDIR:  /usr/local/tomcat/temp
Using JRE_HOME:  /usr
Using CLASSPATH:  /usr/local/tomcat/bin/bootstrap .jar: /usr/local/tomcat/bin/tomcat-juli .jar

查看一下启动的端口号,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@tomcat ~] # netstat -ntulp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address  Foreign Address  State PID /Program  name
tcp 0 0 0.0.0.0:22   0.0.0.0:*   LISTEN 1044 /sshd
tcp 0 0 127.0.0.1:25  0.0.0.0:*   LISTEN 1121 /master
tcp 0 0 127.0.0.1:6010  0.0.0.0:*   LISTEN 12988 /sshd
tcp 0 0 127.0.0.1:6011  0.0.0.0:*   LISTEN 13053 /sshd
tcp 0 0 :::8080   :::*   LISTEN 13088 /java
tcp 0 0 :::22   :::*   LISTEN 1044 /sshd
tcp 0 0 ::1:25   :::*   LISTEN 1121 /master
tcp 0 0 ::1:6010   :::*   LISTEN 12988 /sshd
tcp 0 0 ::1:6011   :::*   LISTEN 13053 /sshd
tcp 0 0 ::ffff:127.0.0.1:8005 :::*   LISTEN 13088 /java
tcp 0 0 :::8009   :::*   LISTEN 13088 /java

下面我们来测试访问一下,

tomcat

好了,到这里我的tomcat就安装完成了,下面我们来tomcat配置虚拟主机。

8.虚拟主机配置

注,为了方便我们下面进行实验,我们得先配置一个虚拟主机。

首先我们来修改一下配置文件,修改的地方有四处,如下图

1
2
3
[root@tomcat1 ~] # cd /usr/local/tomcat/conf/
[root@tomcat1 conf] # cp server.xml server.xml.bak
[root@tomcat1 conf] # vim server.xml

tm1

tm2

tm3

tomcat!

下面来检查一下配置文件,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@tomcat1 conf] # service tomcat configtest
Using CATALINA_BASE:  /usr/local/tomcat
Using CATALINA_HOME:  /usr/local/tomcat
Using CATALINA_TMPDIR:  /usr/local/tomcat/temp
Using JRE_HOME:   /usr
Using CLASSPATH:   /usr/local/tomcat/bin/bootstrap .jar: /usr/local/tomcat/bin/tomcat-juli .jar
Sep 24, 2013 4:52:30 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library  which  allows optimal performance  in  production environments was not found on the java.library.path:  /usr/java/packages/lib/amd64 : /usr/lib64 : /lib64 : /lib : /usr/lib
Sep 24, 2013 4:52:30 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler [ "http-bio-80" ]
Sep 24, 2013 4:52:30 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler [ "ajp-bio-8009" ]
Sep 24, 2013 4:52:30 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed  in  1266 ms

创建虚拟主机文档目录并创建测试文件,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@tomcat1 conf] # mkdir -pv /web/webapp
mkdir : 已创建目录  "/web"
mkdir : 已创建目录  "/web/webapp"
[root@tomcat1 conf] # cd /web/webapp
[root@tomcat1 webapp] # vim index.jsp
<%@ page language= "java"  %>
<html>
  < head ><title>TomcatA< /title >< /head >
  <body>
  <h1><font color= "red" >TomcatA < /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 >

下面我们来启动并测试一下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@tomcat1 webapp] # service tomcat start
Using CATALINA_BASE:  /usr/local/tomcat
Using CATALINA_HOME:  /usr/local/tomcat
Using CATALINA_TMPDIR:  /usr/local/tomcat/temp
Using JRE_HOME:   /usr
Using CLASSPATH:   /usr/local/tomcat/bin/bootstrap .jar: /usr/local/tomcat/bin/tomcat-juli .jar
[root@tomcat1 webapp] # netstat -ntulp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address    Foreign Address    State  PID /Program  name
tcp  0  0 0.0.0.0:22     0.0.0.0:*     LISTEN  1044 /sshd
tcp  0  0 127.0.0.1:25    0.0.0.0:*     LISTEN  1121 /master
tcp  0  0 127.0.0.1:6010    0.0.0.0:*     LISTEN  1159 /sshd
tcp  0  0 :::80      :::*      LISTEN  11716 /java
tcp  0  0 :::22      :::*      LISTEN  1044 /sshd
tcp  0  0 ::1:25      :::*      LISTEN  1121 /master
tcp  0  0 ::1:6010     :::*      LISTEN  1159 /sshd
tcp  0  0 :::8009      :::*      LISTEN  11716 /java

tm4

好了,到这里我们准备工作就全部完成了,下面我们来说一说apache怎么反向代理tomcat服务器。

二、Apache使用mod_proxy反向代理Tomcat

1.查看模块

要使用mod_proxy与Tomcat实例连接,需要apache已经装载mod_proxy、mod_proxy_http、mod_proxy_ajp和proxy_balancer_module(实现Tomcat集群时用到)等模块: 

1
2
3
4
5
6
7
8
9
10
11
[root@apache ~] # /usr/local/apache/bin/httpd -D DUMP_MODULES | grep proxy
  proxy_module (shared)
  proxy_connect_module (shared)
  proxy_ftp_module (shared)
  proxy_http_module (shared)
  proxy_fcgi_module (shared)
  proxy_scgi_module (shared)
  proxy_wstunnel_module (shared)
  proxy_ajp_module (shared)
  proxy_balancer_module (shared)
  proxy_express_module (shared)

2.修改配置文件