整合 Apache 与 Tomcat

一、 Tomcat连接器的架构

1. 基于Apache做为Tomcat前端的架构来讲,Apache可以通过mod_jk、或mod_proxy模块与后端的Tomcat进行数据交换。
       
2. 对Tomcat来说,每个Web容器实例都有一个Java语言开发的连接器模块组件
           
3. HTTP/1.1负责响应基于HTTP/HTTPS协议的请求,AJP/1.3负责响应基于AJP的请求。           

二、 连接器协议

      Tomcat的Web服务器连接器支持两种协议:AJP和HTTP,它们均定义了以二进制格式在Web服务器和Tomcat之间进行数据传输,并提供相应的控制命令。

      AJP(Apache JServ Protocol)协议
         AJP 协议有三个版本,目前正在使用的AJP协议的版本是AJP13,它基于二进制的格式在Web服务器和Tomcat之间传输数据,而此前的版本AJP10和AJP11则使用文本格式传输数据。(二进制格式会比http协议的文本模式高效的多)
                           
     HTTP协议
         使用HTTP或HTTPS协议在Web服务器和Tomcat之间建立通信,此时,Tomcat就是一个完全功能的HTTP服务器,它需要监听在某端口上以接收来自于前端服务器的请求。
   
     APR (Apache的可移植运行时环境)是提供了通用和标准API的操作系统之上一个通讯层的本地库的集合,它能够为使用了APR的应用程序在与Apache通信时提供较好伸缩能力时带去平衡效用。

三、 Apache 的两种代理模块  (apache默认只自带了mod_proxy模块)

     mod_jk        专用于apache基于AJP协议与后端的tomcat交互通信的模块,需要额外单独编译安装                   
                                 
     mod_proxy      包含了以下三种模块( apache 2.2以后版本才有的一个模块,可以实现让apache将前端的用户请求代理至后端服务器)
                       
          mod_proxy_http             与tomcat的http连接器通信
          mod_proxy_ajp              与tomcat的AJP连接器通信
          mod_proxy_balancer         负载均衡模块, 在代理的时候可以实现负载均衡
 

      
四、 整合Apache 与 Tomcat

1.首先在另外一台机器 node1 上安装Apache

需要用到  httpd-2.4.2.tar.bz2  的源码包

在编译安装Apache之前还应该安装两个包:

apr-1.4.6.tar.bz2             apache的可移植运行时环境
apr-util-1.4.1.tar.bz2        是apr的一个抽象库,可以让程序更好的利用apr的功能
pcre-devel

 (1). 先安装apr-1.4.6.tar.bz2

  
  
  
  
  1. [root@node1 tmp]# tar xf apr-1.4.6.tar.bz2 
  2. [root@node1 tmp]# cd apr-1.4.6 
  3. [root@node1 apr-1.4.6]# ./configure --prefix=/usr/local/apr 
  4. [root@node1 apr-1.4.6]# make && make install 

(2). 安装apr-util-1.4.1           

  
  
  
  
  1. [root@node1 tmp]# tar xf apr-util-1.4.1.tar.bz2 
  2. [root@node1 tmp]# cd apr-util-1.4.1 
  3. [root@node1 apr-util-1.4.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr 
  4. [root@node1 apr-util-1.4.1]# make && make install 


(3). 安装pcre-devel
       # yum -y install pcre-devel

(4). 编译安装apache

  
  
  
  
  1. [root@node1 tmp]# tar xf httpd-2.4.2.tar.bz2 
  2. [root@node1 tmp]# cd httpd-2.4.2 
  3. [root@node1 httpd-2.4.2]#  ./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-proxy --enable-proxy-http --enable-proxy-ajp 
  4. [root@node1 httpd-2.4.2]# make && make install  

1.2、修改httpd的主配置文件,设置其Pid文件的路径

  编辑/etc/httpd/httpd.conf,添加如下行即可:
         PidFile  "/var/run/httpd.pid"

     LoadModule slotmem_shm_module modules/mod_slotmem_shm.so     启用这个模块

1.3、提供SysV服务脚本/etc/rc.d/init.d/httpd 内容如下: 

  
  
  
  
  1. #!/bin/bash 
  2. # 
  3. # httpd        Startup script for the Apache HTTP Server 
  4. # 
  5. # chkconfig: - 85 15 
  6. # description: Apache is a World Wide Web server.  It is used to serve \ 
  7. #          HTML files and CGI. 
  8. # processname: httpd 
  9. # config: /etc/httpd/conf/httpd.conf 
  10. # config: /etc/sysconfig/httpd 
  11. # pidfile: /var/run/httpd.pid 
  12.  
  13. # Source function library. 
  14. . /etc/rc.d/init.d/functions 
  15.  
  16. if [ -f /etc/sysconfig/httpd ]; then 
  17.         . /etc/sysconfig/httpd 
  18. fi 
  19.  
  20. # Start httpd in the C locale by default. 
  21. HTTPD_LANG=${HTTPD_LANG-"C"
  22.  
  23. # This will prevent initlog from swallowing up a pass-phrase prompt if 
  24. # mod_ssl needs a pass-phrase from the user. 
  25. INITLOG_ARGS="" 
  26.  
  27. # Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server 
  28. # with the thread-based "worker" MPM; BE WARNED that some modules may not 
  29. # work correctly with a thread-based MPM; notably PHP will refuse to start. 
  30.  
  31. # Path to the apachectl script, server binary, and short-form for messages. 
  32. apachectl=/usr/local/apache/bin/apachectl 
  33. httpd=${HTTPD-/usr/local/apache/bin/httpd} 
  34. prog=httpd 
  35. pidfile=${PIDFILE-/var/run/httpd.pid} 
  36. lockfile=${LOCKFILE-/var/lock/subsys/httpd} 
  37. RETVAL=0 
  38.  
  39. start() { 
  40.         echo -n $"Starting $prog: " 
  41.         LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS 
  42.         RETVAL=$? 
  43.         echo 
  44.         [ $RETVAL = 0 ] && touch ${lockfile} 
  45.         return $RETVAL 
  46.  
  47. stop() { 
  48.     echo -n $"Stopping $prog: " 
  49.     killproc -p ${pidfile} -d 10 $httpd 
  50.     RETVAL=$? 
  51.     echo 
  52.     [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile} 
  53. reload() { 
  54.     echo -n $"Reloading $prog: " 
  55.     if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then 
  56.         RETVAL=$? 
  57.         echo $"not reloading due to configuration syntax error" 
  58.         failure $"not reloading $httpd due to configuration syntax error" 
  59.     else 
  60.         killproc -p ${pidfile} $httpd -HUP 
  61.         RETVAL=$? 
  62.     fi 
  63.     echo 
  64.  
  65. # See how we were called. 
  66. case "$1" in 
  67.   start) 
  68.     start 
  69.     ;; 
  70.   stop) 
  71.     stop 
  72.     ;; 
  73.   status) 
  74.         status -p ${pidfile} $httpd 
  75.     RETVAL=$? 
  76.     ;; 
  77.   restart) 
  78.     stop 
  79.     start 
  80.     ;; 
  81.   condrestart) 
  82.     if [ -f ${pidfile} ] ; then 
  83.         stop 
  84.         start 
  85.     fi 
  86.     ;; 
  87.   reload) 
  88.         reload 
  89.     ;; 
  90.   graceful|help|configtest|fullstatus) 
  91.     $apachectl $@ 
  92.     RETVAL=$? 
  93.     ;; 
  94.   *) 
  95.     echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}" 
  96.     exit 1 
  97. esac 
  98.  
  99. exit $RETVAL 


而后为此脚本赋予执行权限:
      # chmod +x /etc/rc.d/init.d/httpd

1.4、加入服务列表:
      # chkconfig --add httpd

1.5、加入PATH环境变量
        # vi /etc/profile
            PATH=$PATH:/usr/local/apache/bin/
   
        # export PATH=$PATH:/usr/local/apache/bin/
   
1.6、 查看支持的模块    

  
  
  
  
  1. [root@node1 ~]# httpd -l            显示加载的静态模块 
  2. Compiled in modules: 
  3.   core.c 
  4.   mod_so.c 
  5.   http_core.c 
  6.   event.c 
  
  
  
  
  1. [root@node1 ~]# httpd -D DUMP_MODULES           显示加载的所有模块 
  2. Loaded Modules:                                    要有proxy模块 
  3.  
  4.  proxy_module (shared) 
  5.  
  6.  proxy_http_module (shared) 
  7.  proxy_ajp_module (shared) 
  8.  proxy_balancer_module (shared) 
  9.  proxy_express_module (shared) 

1.7、启动测试apache

  
  
  
  
  1. [root@node1 httpd]# /etc/init.d/httpd start 
  2. Starting httpd:                                            [  OK  ] 

 

2 . 配置Apache 通过 mod_proxy 模块与 Tomcat连接

      mod_proxy模块又支持ajp连接器和http连接器与Tomcat通信

2.1使用 http 连接器

1> 首先编辑Apache 的主配置文件  /etc/httpd/httpd.conf

    启用    Include /etc/httpd/extra/httpd-vhosts.conf
    注释中心主机: # DocumentRoot "/usr/local/apache/htdocs"

2> 配置虚拟主机

  
  
  
  
  1. [root@node1 httpd]# vi extra/httpd-vhosts.conf 
  2.  
  3.  
  4. ProxyVia Off 关闭正向代理
    ProxyRequests Off
    ProxyPreserveHost Off off 表示任何对 "tomcat.yue.com" 的请求  都定位到后端 Tomcat 的默认虚拟主机上
  5.  
  6. <VirtualHost *:80> 
  7.         ServerName      tomcat.yue.com 
  8. #       DocumentRoot    "/web/tomcat" 
  9.       
  10.         ProxyPass           / http://192.168.1.12:8080/     把前端用户请求的URL路径,以哪种协议转到后端的哪个tomcat服务器上的哪个端口上 
  11.         ProxyPassReverse    / http://192.168.1.12:8080/ 
  12.     
  13. </VirtualHost> 

3> 修改 Windows 主机的hosts文件

      C:\Windows/System32\drivers\etc\hosts  文件中添加      “192.168.1.10    tomcat.yue.com”

4> 测试一下效果

 

5>  让在apache中定义的虚拟主机定位到与后端 Tomcat中同名的虚拟主机上

修改 extra/httpd-vhosts.conf

  
  
  
  
  1. [root@node1 httpd]# vi extra/httpd-vhosts.conf 
  2.  
  3.  
  4. ProxyVia Off
    ProxyRequests Off
    ProxyPreserveHost On
    定位到后端Tomcat中与当前主机名相同的虚拟主机上
  5.  
  6. <VirtualHost *:80> 
  7.         ServerName      tomcat.yue.com 
  8. #       DocumentRoot    "/web/tomcat" 
  9.       
  10.         ProxyPass           / http://192.168.1.12:8080/ 
  11.         ProxyPassReverse    / http://192.168.1.12:8080/ 
  12. </VirtualHost> 
  13.  
  14. [root@node1 httpd]# /etc/init.d/httpd restart 
  15. Stopping httpd:                                            [  OK  ] 
  16. Starting httpd:                                            [  OK  ] 

测试一下效果

此时我们也可以打开Tomcat的管理器,查看Tomcat的状态信息:

 

 

2.2使用 ajp 连接器

 修改extra/httpd-vhosts.conf

  
  
  
  
  1. [root@node1 httpd]# vi extra/httpd-vhosts.conf
  2.  
  3. ProxyVia            Off 
  4. ProxyRequests       Off 
  5. ProxyPreserveHost   Off 
  6.  
  7. <VirtualHost *:80> 
  8.         ServerName      tomcat.yue.com 
  9. #       DocumentRoot    "/web/tomcat" 
  10.         ProxyPass           / ajp://192.168.1.12:8009/  注意: ajp连接器使用的是8009端口
  11.         ProxyPassReverse    / ajp://192.168.1.12:8009/ 
  12. </VirtualHost> 

 重启Apache

  
  
  
  
  1. [root@node1 httpd]# /etc/init.d/httpd restart 
  2. Stopping httpd:                                            [  OK  ] 
  3. Starting httpd:                                            [  OK  ] 

测试一下:

查看此时连接的状态信息:

3. 配置apache通过mod_jk模块与Tomcat连接

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

3.1 由于mod-jk 模块apache并没有自带,所以需要手动编译安装

  
  
  
  
  1.     [root@node1 tmp]# tar xf tomcat-connectors-1.2.37-src.tar.gz   
  2.     [root@node1 tmp]# cd tomcat-connectors-1.2.37-src/native/  
  3.     [root@node1 native]# ./configure --with-apxs=/usr/local/apache/bin/apxs  注意此时所在的路径
  4.  
  5.  
  6.     checking build system type... i686-pc-linux-gnu  
  7.     checking host system type... i686-pc-linux-gnu  
  8.     checking target system type... i686-pc-linux-gnu  
  9.     checking for a BSD-compatible install... /usr/bin/install -c  
  10.     checking whether build environment is sane... yes  
  11.     checking for gawk... gawk  
  12.     checking whether make sets $(MAKE)... yes  
  13.     checking for test... /usr/bin/test  
  14.     checking for grep... /bin/grep  
  15.     checking for echo... /bin/echo  
  16.     checking for sed... /bin/sed  
  17.     checking for cp... /bin/cp  
  18.     checking for mkdir... /bin/mkdir  
  19.     need to check for Perl first, apxs depends on it...  
  20.     checking for perl... /usr/bin/perl  
  21.     APRINCLUDEDIR is  -I/usr/local/apr/include/apr-1 -I/usr/local/apr-util/include/apr-1  
  22.     building connector for "apache-2.0"  
  23.  
  24. ......   ...... 
  25.     configure: creating ./config.status  
  26.     config.status: creating Makefile  
  27.     config.status: creating apache-1.3/Makefile  
  28.     config.status: creating apache-1.3/Makefile.apxs  
  29.     config.status: creating apache-2.0/Makefile  
  30.     config.status: creating apache-2.0/Makefile.apxs  
  31.     config.status: creating common/Makefile  
  32.     config.status: creating common/list.mk  
  33.     config.status: creating common/jk_types.h  
  34.     config.status: creating common/config.h  
  35.     config.status: executing depfiles commands  
  36.       
  37.     [root@node1 native]# make && make install  

3.2  apache要使用mod_jk连接器,需要在启动时加载此连接器模块。为了便于管理与mod_jk模块相关的配置,这里使用一个专门的配置文件/etc/httpd/extra/httpd-jk.conf来保存相关指令及相关设ersFile指定的,在apache启动时,mod_jk会扫描此文件获取每一个worker的配置信息。

  
  
  
  
  1. [root@node1 httpd]# vi extra/httpd-jk.conf    内容如下: 
  2.  
  3. # Load the mod_jk 
  4. LoadModule  jk_module  modules/mod_jk.so 
  5. JkWorkersFile  /etc/httpd/extra/workers.properties          每个tomcat的engine(或实例)就叫一个work,使用一个专用的配置文件记录所有的work 
  6. JkLogFile  logs/mod_jk.log          指定mod_jk模块的日志文件 
  7. JkLogLevel  debug                   用于指定日志的级别(info, error, debug),第一次使用时可以打开,便于查找错误 
  8. JkMount  /*  Tomcat_A               * 表示根下的所有内容都转发, 后端的work名称,    work的名字在tomcat的配置文件的engine  中定义--> "jvmRoute=“work_Name”" 
  9. JkMount  /status/  stat1            所有的状态定义到stat1 上 ,我们可以在路径后加上stat1来查看相关的状态信息

3.3 对于apache代理来说,每一个后端的Tomcat实例中的engine都可以视作一个worker,而每一个worker的地址、连接器的端口等信息都需要在apache端指定以便apache可以识别并使用这些worker。
具体路径则是使用前面介绍过的JkWorkersFile指定的,在apache启动时,mod_jk会扫描此文件获取每一个worker的配置信息。我们这里使用/etc/httpd/extra/workers.properties

  
  
  
  
  1. [root@node1 httpd]# vi extra/workers.properties  
  2.  
  3. worker.list=Tomcat_A,stat1  worker列表
  4. worker.Tomcat_A.port=8009 
  5. worker.Tomcat_A.host=192.168.1.12 
  6. worker.Tomcat_A.type=ajp13 
  7. worker.Tomcat_A.lbfactor=1 
  8. worker.stat1.type = status  定义了stat1 的类型

3.4  编辑Apache的主配置文件

  
  
  
  
  1. [root@node1 httpd] # vi /etc/httpd/httpd.conf 
  2.  
  3.  注释掉这行:# Include /etc/httpd/extra/httpd-vhosts.conf 
  4.      加入  :Include /etc/httpd/extra/httpd-jk.conf 
  5.  
  6.  
  7. 重启Apache
  8. [root@node1 httpd]# /etc/init.d/httpd restart
    Stopping httpd: [ OK ]
    Starting httpd: [ OK ]

3.5 编辑Tomcat的主配置文件

  
  
  
  
  1. [root@node2 tomcat]# vi conf/server.xml  
  2.      <Engine name="Catalina" defaultHost="localhost" jvmRoute="Tomcat_A">    在Engine 中添加关于“Tomcat_A”的设置 
  3.        
  4. [root@node2 tomcat]# bin/catalina.sh stop 
  5. Using CATALINA_BASE:   /usr/local/tomcat 
  6. Using CATALINA_HOME:   /usr/local/tomcat 
  7. Using CATALINA_TMPDIR: /usr/local/tomcat/temp 
  8. Using JRE_HOME:        /usr/java/jdk1.7.0_05 
  9. Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar 
  10.  
  11.  
  12. [root@node2 tomcat]# bin/catalina.sh start 
  13. Using CATALINA_BASE:   /usr/local/tomcat 
  14. Using CATALINA_HOME:   /usr/local/tomcat 
  15. Using CATALINA_TMPDIR: /usr/local/tomcat/temp 
  16. Using JRE_HOME:        /usr/java/jdk1.7.0_05 
  17. Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar 

3.6. 在Windows主机的hosts文件中添加 “mail.yue.com   192.168.1.10” 可以使用测试使用

测试一下:

 

 

通过添加 status 路径来查看状态信息

 


Over !

你可能感兴趣的:(apache,tomcat,mod-jk,mod-proxy,apr)