一、Tomcat简介
Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5 支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。目前最新版本是7.0。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML 页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS、Apache等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为7.0.39。
Tomcat最初是由Sun的软件构架师詹姆斯·邓肯·戴维森开发的。后来他帮助将其变为开源项目,并由Sun贡献给Apache软件基金会。由于大部分开源项目O’Reilly都会出一本相关的书,并且将其封面设计成某个动物的素描,因此他希望将此项目以一个动物的名字命名。因为他希望这种动物能够自己照顾自己,最终,他将其命名为Tomcat(英语公猫或其他雄性猫科动物)。而O’Reilly出版的介绍Tomcat的书籍(ISBN 0-596-00318-8)[1]的封面也被设计成了一个公猫的形象。而Tomcat的Logo兼吉祥物也被设计成了一只公猫。
二、Java环境JDK的部署
2.1、JAVA介绍
JAVA组件主要包括四个独立却又彼此相关的技术:
java程序语言设计、java api、java class、JVM。其中JVM是java虚拟机,不同的系统上通过部署JVM来实现java程序的解析和运行,这样就实现了java的哲学原理:一次编译、到处运行!
JVM的实现方式:
一次解释器,解释字节并执行,是一句一句的进行解析;
即时编译器,解释后的数据会缓存下来,需要更多的内存来缓存解释后的结果;
自适应编译器:缓存20%的代码,提高80%左右的速度,此遵循“二八法则”!
JVM的种类:
sun的HotSpot JVM,其包括JRE和JDK,JRE只是实现java的运行环境,而JDK中包涵了JAVA的开发环境和运行环境;
开源的OpenJDK:其类似于JDK,也是实现开发和运行环境的组合。
JAVA根据应用领域的不同,java可分为两类
java SE:标准版,早先叫J2SE
java EE:企业版,J2EE
jave ME:移动版,J2ME
2.2、JAVA环境JDK安装和配置
java环境的安装可以使rpm、通用二进制、源码编译方式进行安装,这里使用通用二进制的bin格式的包来进行安装
使用jdk-6u21-linux-x64-rpm.bin包进行安装
1
2
|
[
root
@
localhost
~
]
# chmod +x jdk-6u21-linux-x64-rpm.bin #增加执行权限
[
root
@
localhost
~
]
# ./jdk-6u21-linux-x64-rpm.bin #安装jdk
|
默认的安装目录是在/usr/java 目录下,其中有/usr/java/ jdk1.6.0_21/bin/目录下是java的常用命令
设置环境变量、使系统可以调用JDK环境
1
2
3
4
5
6
7
|
[
root
@
localhost
java
]
# vim /etc/profile.d/java.sh
#添加环境变量,增加如下内容
JAVA_HOME
=
/
usr
/
java
/
jdk1
.
6.0_21
export
PATH
=
$
PATH
:
$
JAVA_HOME
/
bin
[
root
@
localhost
java
]
# . /etc/profile.d/java.sh
#执行下脚本,使环境立即生效
[
root
@
localhost
~
]
# java –version #查看java的版本等信息
|
java的相关参数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
-
XX
:
+
<
option
>开启此参数指定的功能
-
XX
:
-
<
option
>关闭功能
-
XX
:
<
option
>=
<
value
>给
option指定的选项赋值
-
XX
:
+
PrintFlagsFinal显示所有参数
-
D
<
name
>=
<
value
>
:设置系统参数
java的相关监控命令
jps:
JVM
Process
Status
Toll,显示指定系统内所有使用
Hotspot虚拟机进程的列表信息
jstat:
JVM
Statistic
Monitoring
Tool:收集并显示
Hotspot虚拟机各方面的运行数据
jinfo:显示正在运行的
Hotspot虚拟机的配置信息
-
sysprops
pid
显示某个虚拟机的配置信息的
jmap:生成某
hotspot虚拟机的内存转储快照,用于调试
可视化工具:
jconsole:
java的监控与管理控制台
jvisualvm
:
java的虚拟平台的可视化工具
fg:使用
jconsole工具
[
root
@
localhost
jdk1
.
6.0_21
]
# jconsole #会启动一个图形界面
|
![](https://i-blog.csdnimg.cn/blog_migrate/429af26f14cb604566af903cb3c44898.png)
1
|
[
root
@
localhost
bin
]
# jvisualvm #也是一个可视化工具
|
三、tomcat的安装和配置
3.1、tomcat的架构运行层次如下图
上图解释:
server:在最外层,每个server就是一个tomcat实例。又叫顶级组件
service服务:将一个和多个连接器关联到一个引擎上。一个service内部只能有一个引擎。
Engine,引擎:servlet的实现jvm,能够解码别人发来的请求,其内部有一个web服务器,其可以工作在80端口上。定义的时候需要定义一个默认主机,来响应没有指定主机的访问。
HOST:容器内的主机,类似apache的虚拟主机,主机可以有多了
Context,主机内的,类似于路径别名的定义
连接器:将server和引擎连接起来的工具。
其配置结构如下,配置文件为server.xml
1
2
3
4
5
6
7
8
9
10
|
<
Server
>
<
Service
>
<
Connector
/
>
<
Engine
>
<
Host
>
<
Context
>
<
/
Context
>
<
/
Host
>
<
/
Engine
>
<
/
Service
>
<
/
Server
>
|
3.2、tomcat安装
此处使用最新版安装:apache-tomcat-7.0.40.tar.gz
1
2
3
4
5
|
[
root
@
localhost
~
]
# tar xf apache-tomcat-7.0.40.tar.gz -C /usr/local/
#解压到/usr/local
[
root
@
localhost
~
]
# cd /usr/local/
[
root
@
localhost
local
]
# ln -sv apache-tomcat-7.0.40 tomcat
#创建个连接文件
|
配置文件:
所有配置文件都在tomcat的安装目录下的conf目录内
主配置文件server.xml详解
1
2
3
4
5
6
7
8
9
10
|
启动
tomcat
要想启动
tomcat,首先需要输出环境变量,建立
tomcat的环境变量
[
root
@
localhost
conf
]
# vim /etc/profile.d/tomcat.sh
#编辑环境变量,添加如下内容
export
CATALINA_HOME
=
/
usr
/
local
/
tomcat
export
PATH
=
$
PATH
:
$
CATALINA_HOME
/
bin
[
root
@
localhost
conf
]
# . /etc/profile.d/tomcat.sh
#执行下脚本,使其加入到环境变量内来
[
root
@
localhost
bin
]
# catalina.sh version
#查看服务运行情况,也可以使用varsion.sh
|
启动tomcat
[root@localhost ~]# catalina.sh start
至此我们的tomcat已经能够起来了,访问以下网页测试以下
1
2
3
|
[
root
@
localhost
tomcat
]
# ls work/Catalina/localhost/_/org/apache/jsp/
index_jsp
.
class
index_jsp
.
java
#java解析的工作目录,把index转换为.class和index.java
|
3.3、添加一个tomcat的服务脚本,便于管理tomcat服务
1
2
3
4
5
6
7
8
9
10
|
[
root
@
localhost
~
]
# vim /etc/init.d/tomcat
#建立服务脚本,添加如下内容
#!/bin/sh
# Tomcat init script for Linux.
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
JAVA_HOME
=
/
usr
/
java
/
latest
CATALINA_HOME
=
/
usr
/
local
/
tomcat
export
JAVA_HOME
CATALINA_HOME
exec
$
CATALINA_HOME
/
bin
/
catalina
.
sh
$
*
|
为其增加执行权限并增加至系统服务列表
1
2
3
|
[
root
@
localhost
~
]
# chmod +x /etc/init.d/tomcat
[
root
@
localhost
~
]
# chkconfig --add tomcat
[
root
@
localhost
~
]
# chkconfig --list tomcat
|
关闭和启动服务就可以通过系统服务那样进行了
1
2
|
[
root
@
localhost
~
]
# service tomcat stop
[
root
@
localhost
~
]
# service tomcat start
|
上面提到的管理接口的时候需要用户名和密码
在tomcat-users.xml定义用户和密码,然后通过输入用户名和密码进行认证进入管理接口
1
2
3
|
[
root
@
localhost
conf
]
# vim tomcat-users.xml #编辑tomcat的用户配置文件,在注释行外面添加如下内容
<
role
rolename
=
"manager-gui"
/
>
<
user
username
=
"chris"
password
=
"chris"
roles
=
"manager-gui"
/
>
#roles有三种:manager-gui实现状态和Manager App查看和管理;manger-status实现Host Manager功能,如果一个用户需要使用多个角色,角色中间使用逗号隔开即可,例如roles=“manger-status,admin-gui”
|
测试如下:
此时我们通过刚才的设置,用户还没有Host Manager的权限,如果想要管理主机,可以在刚才的roles的设置里增加上admin-gui角色即可!
四、架构Nginx实现反向代理tomcat
4.1、自己先部署一个jsp的网站、方便下面的操作,使用JavaCenter_Home_2.0_GBK.tar.bz2
在server.xml内新建一个虚拟主机
1
2
3
4
5
6
|
[
root
@
localhost
~
]
# vim /usr/local/tomcat/conf/server.xml #编辑配置文件,添加如下内容
<
Engine
name
=
"Catalina"
defaultHost
=
"www.chris.com"
>
#把默认引擎修改为我们自己的主机,方便测试
<
Host
name
=
"www.chris.com"
appBase
=
"/web"
unpackWARs
=
"ture"
autoDeploy
=
"ture"
>
<
Context
path
=
"/"
docBase
=
"webapp"
reloadable
=
"ture"
/
>
<
/
Host
>
|
由于使用的是基于主机名的虚拟主机,所以需要先能解析:
1
2
3
4
5
6
7
|
[
root
@
localhost
webapp
]
# vim /etc/hosts #添加如下内容
172.16.7.20
www
.
chris
.
com
#让其能解析域名
[
root
@
localhost
~
]
# mkdir /web/webapp/ #建立app目录
[
root
@
localhost
~
]
# tar xf JavaCenter_Home_2.0_GBK.tar.bz2 #解压网页
[
root
@
localhost
~
]
# mv JavaCenter_Home_2.0_GBK/* /web/webapp/ #所有文件移到app目录
注意:此网站依赖于
mysql,利用
yum安装下
mysql
[
root
@
localhost
~
]
# yum –y install mysql-server
|
安装JavaCenter
创建数据库和用户名
1
2
3
|
[
root
@
localhost
~
]
# mysql
mysql
>
CREATE
DATABASE
jcenter
;
mysql
>
GRANT
ALL
ON
jcenter
.
*
TO
'jcenter'
@
'localhost'
IDENTIFIED
BY
'chris'
;
|
安装配置以后,可以进入主页,显示如下
4.2、Nginx+tomcat实现其反向代理
架构图如下
安装并配置nginx
安装环境:
1
2
3
4
|
Development
Libraries和
Development
Tools
[
root
@
node1
~
]
# groupadd -r -g 106 nginx
[
root
@
node1
~
]
# useradd -r -g 106 nginx
[
root
@
node1
~
]
# yum -y install opessl-devel pcre-devel
|
安装nginx
1
2
3
4
|
[
root
@
node1
nginx
-
1.4.1
]
# cd nginx-1.4.1
[
root
@
node1
nginx
-
1.4.1
]
# cd nginx-1.4.1
[
root
@
node1
nginx
-
1.4.1
]
# ./configure --prefix=/usr --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre
[
root
@
node1
nginx
-
1.4.1
]
# make && make install
|
提供nginx的服务配置脚本
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
[
root
@
node1
nginx
-
1.4.1
]
# vim /etc/init.d/nginx 添加如下内容
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
.
/
etc
/
rc
.
d
/
init
.
d
/
functions
# Source networking configuration.
.
/
etc
/
sysconfig
/
network
# Check that networking is up.
[
"$NETWORKING"
=
"no"
]
&&
exit
0
nginx
=
"/usr/sbin/nginx"
prog
=
$
(
basename
$
nginx
)
NGINX_CONF_FILE
=
"/etc/nginx/nginx.conf"
[
-
f
/
etc
/
sysconfig
/
nginx
]
&&
.
/
etc
/
sysconfig
/
nginx
lockfile
=
/
var
/
lock
/
subsys
/
nginx
make_dirs
(
)
{
# make required directories
user
=
`
nginx
-
V
2
>
&
1
|
grep
"configure arguments:"
|
sed
's/[^*]*--user=\([^ ]*\).*/\1/g'
-
`
options
=
`
$
nginx
-
V
2
>
&
1
|
grep
'configure arguments:'
`
for
opt
in
$
options
;
do
if
[
`
echo
$
opt
|
grep
'.*-temp-path'
`
]
;
then
value
=
`
echo
$
opt
|
cut
-
d
"="
-
f
2
`
if
[
!
-
d
"$value"
]
;
then
# echo "creating" $value
mkdir
-
p
$
value
&&
chown
-
R
$
user
$
value
fi
fi
done
}
start
(
)
{
[
-
x
$
nginx
]
||
exit
5
[
-
f
$
NGINX_CONF_FILE
]
||
exit
6
make_dirs
echo
-
n
$
"Starting $prog: "
daemon
$
nginx
-
c
$
NGINX_CONF_FILE
retval
=
$
?
echo
[
$
retval
-
eq
0
]
&&
touch
$
lockfile
return
$
retval
}
stop
(
)
{
echo
-
n
$
"Stopping $prog: "
killproc
$
prog
-
QUIT
retval
=
$
?
echo
[
$
retval
-
eq
0
]
&&
rm
-
f
$
lockfile
return
$
retval
}
restart
(
)
{
configtest
||
return
$
?
stop
sleep
1
start
}
reload
(
)
{
configtest
||
return
$
?
echo
-
n
$
"Reloading $prog: "
killproc
$
nginx
-
HUP
RETVAL
=
$
?
echo
}
force_reload
(
)
{
restart
}
configtest
(
)
{
$
nginx
-
t
-
c
$
NGINX_CONF_FILE
}
rh_status
(
)
{
status
$
prog
}
rh_status_q
(
)
{
rh_status
>
/
dev
/
null
2
>
&
1
}
case
"$1"
in
start
)
rh_status_q
&&
exit
0
$
1
;
;
stop
)
rh_status_q
||
exit
0
$
1
;
;
restart
|
configtest
)
$
1
;
;
reload
)
rh_status_q
||
exit
7
$
1
;
;
force
-
reload
)
force_reload
;
;
status
)
rh_status
;
;
condrestart
|
try
-
restart
)
rh_status_q
||
exit
0
;
;
*
)
echo
$
"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit
2
esac
|
增加权限并加入服务列表
1
2
3
|
[
root
@
node1
nginx
-
1.4.1
]
# chmod +x /etc/init.d/nginx
[
root
@
node1
nginx
-
1.4.1
]
# chkconfig --add nginx
[
root
@
node1
nginx
]
# service nginx start
|
保证nginx是能正常访问
修改配置文件,让请求其连接都代理至后端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
|
http
{
include
mime
.
types
;
default_type
application
/
octet
-
stream
;
sendfile
on
;
keepalive_timeout
65
;
proxy_cache_path
/
nginx
/
cache
levels
=
1
:
2
keys_zone
=
first
:
10m
inactive
=
24h
max_size
=
1g
;
upstream
backend
{
server
192.168.0.1
weight
=
1
;
}
#gzip on;
server
{
listen
80
;
server_name
localhost
;
#charset koi8-r;
index
index
.
jsp
index
.
html
;
#access_log logs/host.access.log main;
location
~
*
"\.(jsp|do)$"
{
proxy_pass
http
:
//backend;
}
location
/
{
root
html
;
rewrite
/
http
:
//172.16.7.6/index.jsp last;
}
location
~
*
"\.(jpg|jpeg|png|gif|html|css)$"
{
proxy_pass
http
:
//backend;
proxy_cache
first
;
proxy_cache_valid
200
24h
;
proxy_cache_valid
302
10m
;
add_header
X
-
Cache
-
Status
$
upstream_cache_status
;
}
|
nginx.conf内只需要修改上面的内容即可,其详细解释如下图
通过以上配置我们实现了nginx反向代理tomcat的架构!测试如下:
至此我们的nginx实现tomcat的反向代理已经搭建成功,并且实现了动态网页代理到后端tomcat服务器上,静态网页缓存到本地!
五、Apache使用mod_jk和mod_proxy反向代理tomcat
5.1基本介绍
httpd通过mod_proxy或者mod_jk模块来对tomcat进行反向代理,而且其比Nginx的强大,Nginx的反向代理只能通过http协议进行代理,而apache既可以代理http协议,还可以代理ajp协议,而且mod_proxy 还可以实现session会话的绑定。mod_jk其开发就是对tomcat做反向代理的,通过apache反向代理tomcat的时候,我们可以在tomcat上禁止http连接器,从而来防止前端客户和tomcat通信,所有的连接都是通过apache的代理进来,这样可以增加后端主机的安全性!
5.2、环境配置和架构
Apache上网络基本配置
1
2
3
4
5
6
7
8
9
10
11
12
|
外网
IP
DEVICE
=
eth0
BOOTPROTO
=
static
IPADDR
=
172.16.7.6
NETMASK
=
255.255.0.0
ONBOOT
=
yes
内网
IP
DEVICE
=
eth1
BOOTPROTO
=
static
IPADDR
=
192.168.0.2
NATMASK
=
255.255.255.0
ONBOOT
=
yes
|
Tomcat1上基本网络设置和域名解析文件
1
2
3
4
5
6
7
8
9
10
11
12
|
vim
/
etc
/
sysconfig
/
network
-
scripts
/
ifcfg
-
eth0
修改为如下内容
DEVICE
=
"eth0"
BOOTPROTO
=
"static"
GATEWAY
=
"192.168.0.2"
IPADDR
=
"192.168.0.1"
NETMASK
=
"255.255.255.0"
NM_CONTROLLED
=
"yes"
ONBOOT
=
"yes"
TYPE
=
"Ethernet"
设置域名解析
hosts文件
vim
/
etc
/
hosts
192.168.0.1
tomcat1
.
chris
.
com
|
Tomcat2上基本网络配置和域名解析文件
1
2
3
4
5
6
7
8
9
10
11
12
|
vim
/
etc
/
sysconfig
/
network
-
scripts
/
ifcfg
-
eth0
修改为如下内容
DEVICE
=
"eth0"
BOOTPROTO
=
"static"
GATEWAY
=
"192.168.0.2"
IPADDR
=
"192.168.0.3"
NETMASK
=
"255.255.255.0"
NM_CONTROLLED
=
"yes"
ONBOOT
=
"yes"
TYPE
=
"Ethernet"
设置域名解析
hosts文件
vim
/
etc
/
hosts
192.168.0.3
tomcat2
.
chris
.
com
|
5.3、在tomcat1和tomcat2上配置java环境并设置,然后建立测试主页
配置和设置环境上面已经详细介绍过,这里不在重述,只配置下虚拟主机和测试网页
tomcat1
虚拟主机的配置
1
2
3
4
5
6
7
|
[
root
@
localhost
~
]
# vim /usr/local/tomcat/conf/server.xml #编辑配置文件,修改为以下内容
<
Engine
name
=
"Catalina"
defaultHost
=
"tomcat1.chris.com"
>
<
Host
name
=
"tomcat1.chris.com"
appBase
=
"/web"
unpackWARs
=
"true"
autoDeploy
=
"true"
>
<
Context
path
=
"/"
docBase
=
"webapp"
reloadable
=
"ture"
/
>
<
/
Host
>
测试页面为前面搭建的
jscent
|
tomcat2
1
2
3
4
5
6
|
[
root
@
localhost
~
]
# vim /usr/local/tomcat/conf/server.xml #编辑配置文件,修改为以下内容
<
Engine
name
=
"Catalina"
defaultHost
=
"tomcat2.chris.com"
>
<
Host
name
=
"tomcat2.chris.com"
appBase
=
"/web"
unpackWARs
=
"true"
autoDeploy
=
"true"
>
<
Context
path
=
"/"
docBase
=
"webapp"
reloadable
=
"ture"
/
>
<
/
Host
>
|
设置数据库并创建用户名和设置权限
1
2
3
4
5
|
[
root
@
localhost
webapp
]
# mysql
mysql
>
create
database
jsprun
;
mysql
>
grant
all
on
jsprun
.
*
to
'jsprun'
@
'localhost'
identified
by
'chris'
;
安装、初始化
jsprun
http
:
//192.168.0.3/install.jsp
|
测试页面为前面搭建的jsprun,页面如下
5.4、安装配置apache
httpd-2.4.4安装依赖的较新apr-1.4.6.tar.bz2和 apr-util-1.5.2.tar.bz2,由于系统上的apr还被别软件所依赖,不能直接卸载,所以这里采用编译源码安装的方式进行
编译安装apr
1
2
3
4
|
[
root
@
node1
~
]
# tar xf apr-1.4.6.tar.bz2
[
root
@
node1
~
]
# cd apr-1.4.6
[
root
@
node1
apr
-
1.4.6
]
# ./configure --prefix=/usr/local/apr --disable-ipv6
[
root
@
node1
apr
-
1.4.6
]
# make && make install
|
编译安装apr-util
1
2
3
4
|
[
root
@
node1
~
]
# tar xf apr-util-1.5.2.tar.bz2
[
root
@
node1
~
]
# cd apr-util-1.5.2
[
root
@
node1
apr
-
util
-
1.5.2
]
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[
root
@
node1
apr
-
util
-
1.5.2
]
# make && make install
|
编译安装httpd
1
2
3
4
|
[
root
@
node1
~
]
# tar xf httpd-2.4.4.tar.bz2
[
root
@
node1
~
]
# cd httpd-2.4.4
[
root
@
node1
httpd
-
2.4.4
]
# ./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
@
node1
httpd
-
2.4.4
]
# make && make install
|
配置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
@
node1
httpd
-
2.4.4
]
# vim /etc/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
|
增加执行权限
1
|
[
root
@
node1
httpd
-
2.4.4
]
# chmod +x /etc/init.d/httpd
|
加入系统服务列表
1
2
3
|
[
root
@
node1
httpd
-
2.4.4
]
# chkconfig --add httpd
[
root
@
node1
httpd
-
2.4.4
]
# chkconfig httpd on
[
root
@
node1
httpd
-
2.4.4
]
# chkconfig --list httpd
|
增加环境变量
1
2
3
|
[
root
@
node1
~
]
# vim /etc/profile.d/httpd.sh 添加如下内容
export
PATH
=
$
PATH
:
/
usr
/
local
/
apache
/
bin
[
root
@
node1
~
]
# . /etc/profile.d/httpd.sh
|
反向代理的配置
1
2
3
4
5
6
7
8
|
httpd
-
D
DUMP_MODULES
查看
httpd的模块
proxy_module
(
shared
)
proxy_http_module
(
shared
)
proxy_ajp_module
(
shared
)
lbmethod_byrequests_module
(
shared
)
#根据请求做负载均衡
lbmethod_bytraffic_module
(
shared
)
#根据流量做负载均衡
lbmethod_bybusyness_module
(
shared
)
#根据繁忙程度负载均衡
lbmethod_heartbeat_module
(
shared
)
#heartbeat模块
|
修改配置文件/etc/httpd/httpd.conf
1
2
3
4
5
6
7
8
9
10
|
注释中心主机
增加虚拟主机的配置文件
#DocumentRoot "/usr/local/apache/htdocs"
ServerRoot
"/usr/local/apache"
PidFile
"/var/run/httpd.pid"
# 增加pid
# Virtual hosts
#Include /etc/httpd/extra/httpd-vhosts.conf
Include
/
etc
/
httpd
/
extra
/
httpd
-
proxy
.
conf
LoadModule
slotmem_shm_module
modules
/
mod_slotmem_shm
.
so
#启动这两个模块,被proxy使用的
LoadModule
slotmem_plain_module
modules
/
mod_slotmem_plain
.
so
|
增加虚拟主机配置
1
2
3
4
5
6
7
8
9
10
11
12
|
[
root
@
node1
logs
]
# vim /etc/httpd/extra/httpd-proxy.conf 添加如下内容
<
VirtualHost *
:
80
>
ProxyRequests
Off
ProxyPass
/
http
:
//192.168.0.1:80/ #前面把tomcat的8080端口修改为了80
ProxyPassReverse
/
http
:
//192.168.0.1:80/
<
Proxy *
>
Require
all
granted
<
/
Proxy
>
<
Location
/
>
Require
all
granted
<
/
Location
>
<
/
VirtualHost
>
|
配置参数解释
ProxyPreserveHost {On|Off}:如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用ProxyPass指定的服务器地址。如果想在反向代理中支持虚拟主机,则需要开启此项,否则就无需打开此功能。
ProxyVia {On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为Off,即不启用此功能;On表示每个请求和响应报文均添加Via:;Full表示每个Via:行都会添加当前apache服务器的版本号信息;Block表示每个代理请求报文中的Via:都会被移除。
ProxyRequests {On|Off}:是否开启apache正向代理的功能;启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为apache设置了ProxyPass,则必须将ProxyRequests设置为Off。
ProxyPass [path] !|url [key=value key=value ...]]:将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服务器上某URL路径。使用此指令时必须将ProxyRequests的值设置为Off。需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。
重启服务,测试如下
至此我们实现了利用mod_proxy实现了一个tomcat的代理
==============================================================
下面配置下mod_jk模块进行配置实现反向代理功能
mod_jk是ASF的一个项目,是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务端是Tomcat的AJP连接器)。,在apache服务器上安装
编译、安装tomcat-connectors
1
2
3
4
|
[
root
@
node1
~
]
# tar xf tomcat-connectors-1.2.37-src.tar.gz
[
root
@
node1
~
]
# cd tomcat-connectors-1.2.37-src/native/
[
root
@
node1
native
]
# ./configure --with-apxs=/usr/local/apache/bin/apxs #编译apache的模块
[
root
@
node1
native
]
# make && make install
|
apache要使用mod_jk连接器,需要在启动时加载此连接器模块。为了便于管理与mod_jk模块相关的配置,这里使用一个专门的配置文件/etc/httpd/extra/httpd-jk.conf来保存相关指令及其设置。其内容如下:
1
2
3
4
5
6
7
8
9
|
# Load the mod_jk
LoadModule
jk_module
modules
/
mod_jk
.
so
JkWorkersFile
/
etc
/
httpd
/
extra
/
workers
.
properties
jk配置文件
JkLogFile
logs
/
mod_jk
.
log
JkLogLevel
debug
JkMount
/
*
TomcatA
把那个
uri路径送到那个
tomcat上去,
TomcatA是
jvm的名称
为了让
apache能使用
/
etc
/
httpd
/
extra
/
httpd
-
jk
.
conf配置文件中的配置信息,需要编辑
/
etc
/
httpd
/
httpd
.
conf,添加如下一行:
Include
/
etc
/
httpd
/
extra
/
httpd
-
jk
.
conf
|
对于apache代理来说,每一个后端的Tomcat实例中的engine都可以视作一个worker,而每一个worker的地址、连接器的端口等信息都需要在apache端指定以便apache可以识别并使用这些worker。约定俗成,配置这些信息的文件通常为workers.properties,其具体路径则是使用前面介绍过的JkWorkersFile指定的,在apache启动时,mod_jk会扫描此文件获取每一个worker的配置信息。比如,我们这里使用/etc/httpd/extra/workers.properties。
配置apache实用mod_jk模块
1
2
3
4
5
6
7
|
[
root
@
node1
bin
]
# vim /etc/httpd/extra/httpd-jk.conf 添加 如下内容
LoadModule
jk_module
modules
/
mod_jk
.
so
JkWorkersFile
/
etc
/
httpd
/
extra
/
workers
.
properties
JkLogFile
logs
/
mod_jk
.
log
JkLogLevel
debug
JkMount
/
*
tomcat1
#tomcat1 必须和workers.properties内定义的相同
JkMount
/
jkstatus
/
stat1
|
根据前文中的指定,这里使用/etc/httpd/extra/workers.properties来定义一个名为TomcatA的worker,并为其指定几个属性。文件内容如下:
1
2
3
4
5
6
7
|
[
root
@
node1
bin
]
# vim /etc/httpd/extra/workers.properties
worker
.
list
=
tomcat1
,
stat1
worker
.
tomcat1
.
type
=
ajp13
worker
.
tomcat1
.
host
=
192.168.0.1
worker
.
tomcat1
.
port
=
8009
worker
.
tomcat1
.
lbfactor
=
1
worker
.
stat1
.
type
=
status
|
重启httpd服务,并进行测试
[root@node1 bin]# service httpd restart
测试页面如下
通过上面的配置和测试,现在已经实现了apache基于mod_proxy和mod_jk反向代理tomcat,下面我们通过apache和两个tomcat实现负载均衡
tomcat1上的配置
修改配置文件,增加jvmRoot的定义,这是集群中必须配置的参数
1
2
|
[
root
@
localhost
~
]
# vim /usr/local/tomcat/conf/server.xml #修改下面参数
<
Engine
name
=
"Catalina"
defaultHost
=
"tomcat1.chris.com"
jvmRoot
=
"tomcat1"
>
|
重启服务使其生效
1
|
[
root
@
localhost
webapp
]
# service tomcat stop
|
tomcat2上的配置
1
2
3
4
|
[
root
@
localhost
~
]
# vim /usr/local/tomcat/conf/server.xml #修改下面参数
<
Engine
name
=
"Catalina"
defaultHost
=
"tomcat2.chris.com"
jvmRoot
=
tomcat2
""
>
[
root
@
localhost
webapp
]
# service tomcat start
[
root
@
localhost
webapp
]
# service tomcat stop
|
两台tomcat服务器上只需要修改上面这两个参数,下面在apache上进行配置
基于mod_jk的负载均衡
1
2
3
4
5
6
7
|
修改
/
etc
/
httpd
/
extra
/
httpd
-
jk
.
conf为如下内容:
LoadModule
jk_module
modules
/
mod_jk
.
so
JkWorkersFile
/
etc
/
httpd
/
extra
/
workers
.
properties
JkLogFile
logs
/
mod_jk
.
log
JkLogLevel
debug
JkMount
/
*
lbcluster1
#lbcluster1集群名称
JkMount
/
jkstatus
/
stat1
|
编辑/etc/httpd/extra/workers.properties,添加如下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
worker
.
list
=
lbcluster1
,
stat1
--
lbcluster1集群名称
worker
.
TomcatA
.
type
=
ajp13
worker
.
TomcatA
.
host
=
172.16.100.1
worker
.
TomcatA
.
port
=
8009
worker
.
TomcatA
.
lbfactor
=
5
worker
.
TomcatB
.
type
=
ajp13
worker
.
TomcatB
.
host
=
172.16.100.2
worker
.
TomcatB
.
port
=
8009
worker
.
TomcatB
.
lbfactor
=
5
worker
.
lbcluster1
.
type
=
lb
负载均衡
work,
lb内置的类
worker
.
lbcluster1
.
sticky_session
=
1
会话绑定
worker
.
lbcluster1
.
balance_workers
=
TomcatA
,
TomcatB
集群中的实列
worker
.
stat1
.
type
=
status
|
重启服务,使配置生效
[root@node1 ~]# service httpd restart
测试访问,已经代理到不同的后端 主机上了
基于mod_proxy的负载均衡
先禁用上面基于mod_jk的配置文件
1
2
3
|
[
root
@
node1
~
]
# vim /etc/httpd/httpd.conf
Include
/
etc
/
httpd
/
extra
/
httpd
-
proxy
.
conf
#启用mod_proxy的配置
#Include /etc/httpd/extra/httpd-jk.conf #禁用mod_jk的配置
|
配置proxy负载均衡
在httpd.conf的全局配置中配置如下内容:
1
2
3
4
5
|
ProxyRequests
Off
<
proxy
balancer
:
//lbcluster1>
BalancerMember
ajp
:
//192.168.0.1:8009 loadfactor=10 route=tomcat1
BalancerMember
ajp
:
//192.168.0.3:8009 loadfactor=10 route=tomcat2
<
/
proxy
>
|
在虚拟主机中实现代理
1
2
3
4
5
|
<
VirtualHost *
:
80
>
ServerName
www
.
magedu
.
com
ProxyPass
/
balancer
:
//lbcluster1/ stickysession=jsessionid
ProxyPassReverse
/
balancer
:
//lbcluster1/
<
/
VirtualHost
>
|
测试结果如下
至此实现了apache基于mod_jk和mod_proxy的负载均衡的反向代理的功能。这两个模块的配置原理大致相同,就是所使用的命令和配置位置有点小出入,需要注意下!
由于配置过程中命令繁多,难免会出现错误,还望各位大牛们指出~~谢谢!
本文出自 “Chris On the way” 博客,请务必保留此出处http://chrinux.blog.51cto.com/6466723/1211622