tomcat部署web服务(二)

整合Apache和Tomcat使Apache以反向代理的方式进行工作

 1、Apache Jserv protocol(AJP):

   该协议使在网络上传输的数据以二进制格式代替纯文本格式,通过TCP协议及分组协议,因此通过该协议传输数据增加了web服务的性能,另外解密请求在web服务器上完成,使得应用程序服务器拥有更小的负载,减少通过TCP协议的网络流量;
   Mod_jk和mod_proxy模块基于AJP协议,对通过浏览器传输大量内容很有帮助;
   1、mod_jk:是一种基于AJP协议整合apache或者IIS和Tomcat的AJP连接器模块,对隐藏后端 tomcat服务和消除浏览器中的tomcat服务端口很有用;
   2、mod_proxy:apache连接tomcat服务器自带的模块;
      mod_proxy子模块:
      mod_proxy_http
      mod_proxy_ajp
      mod_proxy_balancer (负载均衡模块)
注1:tomcat可以处理动态内容,是个应用程序服务器;
注2:使用最新版本的mod_jk模块整合apache和tomcat可以在浏览器中存储64k大小的相应报文头;
注3:用到的相关命令:
    httpd -D -DUMP_MODULES     //列出当前系统上已经启用的模块//

2、安装配置过程

一、安装tomcat

   具体安装过程参考http://wjw7702.blog.51cto.com/5210820/960577

二、编译安装Apache

   安装前准备:

安装yum开发环境“Development Libraries”

    源码包:

        apr-1.4.6.tar.bz2
        apr-util-1.4.1.tar.bz2
        httpd-2.4.2.tar.bz2

 1) 安装apr和apr-util

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

  
  
  
  
  1. # tar xf apr-1.4.6.tar.bz2

  2. # cd apr-1.4.6

  3. #./buildconf

  4. #./configure --prefix=/usr/local/apr

  5. #make && make install  

  6. #cd

  7. #tar xf apr-util-1.4.1.tar.bz2

  8. #cd apr-util-1.4.1

  9. #./buildconf --with-apr=/root/apr-1.4.6

  10. #./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr

  11. #make && make install

 2)安装Apache

  
  
  
  
  1. # yum -y install pcre-devel      //安装pcre的开发库//

  2. # tar xf httpd-2.4.2

  3. # ./configure \

  4.  --prefix=/usr/local/apache \

  5.  --sysconfdir=/etc/httpd \

  6.  --enable-so \

  7.  --enable-ssl \

  8.  --enable-cgi \

  9.  --enable-rewrite \

  10.  --with-zlib \

  11.  --with-pcre \

  12.  --with-apr=/usr/local/apr \

  13.  --with-apr-util=/usr/local/apr-util  \

  14.  --enable-proxy \

  15.  --enable-proxy-http \

  16.  --enable-proxy-ajp     //cgi proxy proxy-http proxy-ajp模块一定要编译进去//

  17. # make && make install

  18. # vim /etc/rc.d/init.d/httpd      //为apache提供init脚本,实现服务的控制//

  19.  添加如下内容

  20.  #!/bin/bash

  21.  #

  22.  # httpd        Startup script for the Apache HTTP Server

  23.  #

  24.  # chkconfig: - 85 15

  25.  # description: Apache is a World Wide Web server.  It is used to serve \

  26.  #          HTML files and CGI.

  27.  # processname: httpd

  28.  # config: /etc/httpd/httpd.conf

  29.  # config: /etc/sysconfig/httpd

  30.  # pidfile: /var/run/httpd.pid

  31.  # Source function library.

  32.  . /etc/rc.d/init.d/functions

  33.  if [ -f /etc/sysconfig/httpd ]; then

  34.          . /etc/sysconfig/httpd

  35.  fi

  36.  # Start httpd in the C locale by default.

  37.  HTTPD_LANG=${HTTPD_LANG-"C"}

  38.  # This will prevent initlog from swallowing up a pass-phrase prompt if

  39.  # mod_ssl needs a pass-phrase from the user.

  40.  INITLOG_ARGS=""

  41.  # Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server

  42.  # with the thread-based "worker" MPM; BE WARNED that some modules may not

  43.  # work correctly with a thread-based MPM; notably PHP will refuse to start.

  44.  # Path to the apachectl script, server binary, and short-form for messages.

  45.  apachectl=/usr/local/apache/bin/apachectl

  46.  httpd=${HTTPD-/usr/local/apache/bin/httpd}

  47.  prog=httpd

  48.  pidfile=${PIDFILE-/var/run/httpd.pid}

  49.  lockfile=${LOCKFILE-/var/lock/subsys/httpd}

  50.  RETVAL=0

  51.  start() {

  52.          echo -n $"Starting $prog: "

  53. LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS

  54. RETVAL=$?

  55.          echo

  56.          [ $RETVAL = 0 ] && touch ${lockfile}

  57.          return $RETVAL

  58.  }

  59.  stop() {

  60.      echo -n $"Stopping $prog: "

  61.      killproc -p ${pidfile} -d 10 $httpd

  62. RETVAL=$?

  63.      echo

  64.      [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}

  65.  }

  66.  reload() {

  67.      echo -n $"Reloading $prog: "

  68.      if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then

  69. RETVAL=$?

  70.          echo $"not reloading due to configuration syntax error"

  71.          failure $"not reloading $httpd due to configuration syntax error"

  72.      else

  73.          killproc -p ${pidfile} $httpd -HUP

  74. RETVAL=$?

  75.      fi

  76.      echo

  77.  }

  78.  # See how we were called.

  79.  case "$1" in

  80.    start)

  81.      start

  82.      ;;

  83.    stop)

  84.      stop

  85.      ;;

  86.    status)

  87.          status -p ${pidfile} $httpd

  88. RETVAL=$?

  89.      ;;

  90.    restart)

  91.      stop

  92.      start

  93.      ;;

  94.    condrestart)

  95.      if [ -f ${pidfile} ] ; then

  96.          stop

  97.          start

  98.      fi

  99.      ;;

  100.    reload)

  101.          reload

  102.      ;;

  103.    graceful|help|configtest|fullstatus)

  104.      $apachectl $@

  105. RETVAL=$?

  106.      ;;

  107.    *)

  108.      echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"

  109.      exit 1

  110.  esac

  111.  exit $RETVAL

  112. 以上为apache的启动脚本内容

  113. #chmod +x /etc/rc.d/init.d/httpd

  114. #chkconfig --add httpd

  115. #chkconfig httpd on

  116. #vim /etc/profile

  117.   添加:PATH=/usr/local/apache/bin:$PATH

  118. #export PATH=/usr/local/apache/bin:$PATH

  119. #vim /etc/man.config

  120.   添加:MANPATH /usr/local/apache/man

  121. #ln -sv /usr/local/apache/include /usr/include/httpd

  122. #vim /etc/httpd/httpd.conf    //修改httpd的主配置文件,设置其Pid文件的路径//

  123.    PidFile  "/var/run/httpd.pid"

  124.    LoadModule slotmem_shm_module modules/mod_slotmem_shm.so //打开LoadModule模块

  125. #service httpd start

  126. #httpd -D DUMP_MODULES | grep proxy        // 确保当前系统上已经装载了与proxy相关的模块//

  127.  proxy_module (shared)

  128.  proxy_connect_module (shared)

  129.  proxy_ftp_module (shared)

  130.  proxy_http_module (shared)

  131.  proxy_fcgi_module (shared)

  132.  proxy_scgi_module (shared)

  133.  proxy_ajp_module (shared)

  134.  proxy_balancer_module (shared)          //实现Tomcat集群时用到的模块//

  135.  proxy_express_module (shared)

三、配置Apache通过mod_proxy模块与Tomcat连接

    下面为http服务建立虚拟主机来提供反向代理,当然也可以在全局文件中提供反向代理功能

  
  
  
  
  1. # vim /etc/httpd/httpd.conf

  2. Include /etc/httpd/extra/httpd-vhosts.conf  //打开虚拟主机选项

  3.   #DocumentRoot "/usr/local/apache/htdocs"    //禁用中心主机

  4. # vim /etc/httpd/extra/httpd-vhosts.conf       //编辑虚拟主机文件关闭虚拟主机样例并添加虚拟主机

  5.   #<VirtualHost *:80>

  6.   #    ServerAdmin [email protected]

  7.   #    DocumentRoot "/usr/local/apache/docs/dummy-host.example.com"

  8.   #    ServerName dummy-host.example.com

  9.   #    ServerAlias www.dummy-host.example.com

  10.   #    ErrorLog "logs/dummy-host.example.com-error_log"

  11.   #    CustomLog "logs/dummy-host.example.com-access_log" common

  12.   #</VirtualHost>

  13.   #

  14.   #<VirtualHost *:80>

  15.   #    ServerAdmin [email protected]

  16.   #    DocumentRoot "/usr/local/apache/docs/dummy-host2.example.com"

  17.   #    ServerName dummy-host2.example.com

  18.   #    ErrorLog "logs/dummy-host2.example.com-error_log"

  19.   #    CustomLog "logs/dummy-host2.example.com-access_log" common

  20.   #</VirtualHost>

  21. 在全局配置段或虚拟主机中添加如下两项内容,这里我添加到了全局配置段中:

  22.      ProxyRequests Off       //关闭正向代理//

  23.      ProxyPreserveHost Off   //将用户请求apache上某虚拟主机转发到tomcat服务器上对应虚拟主机上,不定义该项表示用户请求将被转发到tomcat默认虚拟主机上//

  24. 将Apache跟Tomcat的ajp连接器进行整合

  25.  <VirtualHost *:80>

  26.      ServerName tomcat.wjw.com

  27.      ProxyPass / ajp://172.16.11.11:8009/   //注意当前服务器上的某虚拟路径必须与后端服务器上某URL路径对应,后面也如此//

  28.      ProxyPassReverse / ajp://172.16.11.11:8009/

  29.  </VirtualHost>

# service httpd restart     //重启httpd服务并访问验证

通过mod_proxy模块
整合 Apache和 Tomcat的http连接器:
  
  
  
  
  1. <VirtualHost *:80>

  2.   ServerName tomcat.wjw.com

  3.   ProxyPass / http://172.16.11.11:8080/

  4.   ProxyPassReverse / http://172.16.11.11:8080/

  5. </VirtualHost>


# service httpd restart   //重启httpd服务并访问验证

四、配置Apache通过mod_jk模块与Tomcat连接

1、简要介绍mod_jk模块:

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

  2、编译安装tomcat-connectors-1.2.37-src.tar.gz

a)编译安装mod_jk模块

       下载tomcat-connectors-1.2.37-src.tar.gz安装包至本地/root目录;

  
  
  
  
  1. # tar xf tomcat-connectors-1.2.37-src.tar.gz

  2. # cd tomcat-connectors-1.2.37-src/native

  3. # ./configure �Cwith-apxs=/usr/local/apache/bin/apxs

  4. # make && make install

  5. # ls /usr/local/apache/modules/

  6. mod_jk.so                     //确保mod_jk模块已经存在//

b)新建httpd-jk.conf配置文件
   Apache要使用mod_jk连接器,需要在启动时加载此连接器模块,为了便于管理与mod_jk模块相关的配置,这里使用一个专门的配置文件/etc/httpd/extra/httpd-jk.conf来保存相关指令及其设置。其内容如下:
  
  
  
  
  1. # vim /etc/httpd/extra/httpd-jk.conf

  2.  LoadModule jk_module modules/mod_jk.so

  3.  JkWorkersFile  /etc/httpd/extra/workers.properties   //用于指定保存了worker相关工作属性定义的配置文件//

  4.  JkLogFile  logs/mod_jk.log     //指定mod_jk模块的日志文件//

  5.  JkLogLevel  debug              //指定日志的级别(info, error, debug),这里使用debug级别显得过低,因为是第一次用,使用该级别可以用来排错//

  6.  JkMount  /*  TomcatA           //指定则用于控制URL与Tomcat workers的对应关系,/*表示根下的所有路径均转发给tomcat中的worker,TomcatA需要自己定义//

  7.  JkMount  /status/  stat1       //将用户请求的status信息转发至stat1//

     c)定义tomcat的worker名称
   对于Apache代理来说,每一个后端的Tomcat实例中的engine都可以视作一个worker,定义tomcat的worker名称:
  
  
  
  
  1. # vim /usr/local/tomcat/conf/server.xml  

  2.  修改如下行:  

  3. <Enginename="Catalina"defaultHost="localhost"jvmRoute="TomcatA">

d)新建workers.properties配置文件
   每一个worker的地址、连接器的端口等信息都需要在apache端指定以便Apache可以识别并使用这些worker,约定俗成,配置这些信息的文件通常为workers.properties,其具体路径则是使用前面介绍过的JkWorkersFile指定的,在apache启动时,mod_jk会扫描此文件获取每一个worker的配置信息。比如,我们这里使用/etc/httpd/extra/workers.properties
  
  
  
  
  1. # vim /etc/httpd/extra/workers.properties

  2.   添加如下内容:

  3.   worker.list=TomcatA,stat1    //定义TomcatA,stat1//

  4.   worker.TomcatA.port=8009     //TomcatA上AJP1.3连接器的端口//

  5.   worker.TomcatA.host=172.16.11.11  //TomcatA所在的主机//

  6.   worker.TomcatA.type=ajp13  //定义TomcatA所属类型//

  7.   worker.TomcatA.lbfactor=1  //定义TomcatA权重,这里我们使用的不是负载均衡,所以该项定义为1//

  8.   worker.stat1.type=status   //定义stat1所属类型status(定义用户显示分布式环境中各实际worker工作状态的特殊worker,它不处理任何请求,也不关联到任何实际工作的worker实例)//

     e)让Apache能使用/etc/httpd/extra/httpd-jk.conf配置文件
  
  
  
  
  1. # vim /etc/httpd/httpd.conf

  2.  Include  /etc/httpd/extra/httpd-jk.conf     //添加该行//

  3.  #Include /etc/httpd/extra/httpd-vhosts.conf //禁用虚拟主机//

  # service httpd restart     //重启httpd服务并访问验证测试//


     f)去Manager中查看Server Status的信息

       为manager定义一个manager-gui角色和密码
  
  
  
  
  1. # vim /usr/local/tomcat/conf/tomcat-users.xml

  2.  添加如下行

  3.  <rolerolename="manager-gui"/>

  4.  <userusername="tomcat"password="tomcat"roles="manager-gui"/>  // username和password可以根据自己需要来定义//

      重启tomcat服务并用定义的manager-gui角色名称个密码登录访问manager
  
  
  
  
  1. # /usr/local/tomcat/bin/catalina.sh stop

  2. # /usr/local/tomcat/bin/catalina.sh start


     g)访问mod_jk的状态信息


关闭TomcatA,验证对后端tomcat上的worker健康状况检查效果

3、总结:

   以上就是apache基于mod_jk模块和mod_proxy模块与后端tomcat的worker通信的实现过程, 更多Tomcat内容将持续与大家共同分享。

你可能感兴趣的:(tomcat,http,mod_jk,mod_proxy)