tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

时间:2021-08-08 13:28:09


一、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的版本等信息

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

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            #会启动一个图形界面

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

1
[root@localhost
bin]# jvisualvm               #也是一个可视化工具

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

三、tomcat的安装和配置

3.1、tomcat的架构运行层次如下图

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

上图解释:

   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目录内

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

主配置文件server.xml详解

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

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                
                             #查看服务运行情况,也可以使用 var sion.sh

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

启动tomcat

   [root@localhost ~]# catalina.sh start

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

至此我们的tomcat已经能够起来了,访问以下网页测试以下

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

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”

测试如下:

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

   此时我们通过刚才的设置,用户还没有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

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

创建数据库和用户名

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

1
2
3
[root@localhost
~]# mysql
mysql>
CREATE DATABASE jcenter;
mysql>
GRANT ALL ON jcenter.* TO 
'jcenter' @ 'localhost'  IDENTIFIED BY  'chris' ;

安装配置以后,可以进入主页,显示如下

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

4.2、Nginx+tomcat实现其反向代理

架构图如下

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

安装并配置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组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

修改配置文件,让请求其连接都代理至后端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内只需要修改上面的内容即可,其详细解释如下图

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

通过以上配置我们实现了nginx反向代理tomcat的架构!测试如下:

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

   至此我们的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、环境配置和架构

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

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


tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

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,页面如下

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

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也必须以“/”结尾,反之亦然。

重启服务,测试如下


tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

至此我们实现了利用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

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

   对于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

测试页面如下

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

   通过上面的配置和测试,现在已经实现了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

测试访问,已经代理到不同的后端 主机上了

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

基于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>

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

在虚拟主机中实现代理

1
2
3
4
5
<VirtualHost
*:
80 >
ServerName
www.magedu.com
ProxyPass
/ balancer:
//lbcluster1/ stickysession=jsessionid
ProxyPassReverse
/ balancer:
//lbcluster1/
</VirtualHost>

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

测试结果如下

tomcat组件安装+Nginx反向代理tomcat+Apache使用mod_jk和mod_proxy反向代理和负载均衡

   至此实现了apache基于mod_jk和mod_proxy的负载均衡的反向代理的功能。这两个模块的配置原理大致相同,就是所使用的命令和配置位置有点小出入,需要注意下!

   由于配置过程中命令繁多,难免会出现错误,还望各位大牛们指出~~谢谢!

本文出自 “Chris—on the way” 博客,请务必保留此出处http://chrinux.blog.51cto.com/6466723/1211622