整合 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.         ProxyPa***everse    / 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.         ProxyPa***everse    / 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.         ProxyPa***everse    / 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 !

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章