一、 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
- [root@node1 tmp]# tar xf apr-1.4.6.tar.bz2
- [root@node1 tmp]# cd apr-1.4.6
- [root@node1 apr-1.4.6]# ./configure --prefix=/usr/local/apr
- [root@node1 apr-1.4.6]# make && make install
(2). 安裝apr-util-1.4.1
- [root@node1 tmp]# tar xf apr-util-1.4.1.tar.bz2
- [root@node1 tmp]# cd apr-util-1.4.1
- [root@node1 apr-util-1.4.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
- [root@node1 apr-util-1.4.1]# make && make install
(3). 安裝pcre-devel
# yum -y install pcre-devel
(4). 編譯安裝apache
- [root@node1 tmp]# tar xf httpd-2.4.2.tar.bz2
- [root@node1 tmp]# cd httpd-2.4.2
- [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
- [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 內容如下:
- #!/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
而後爲此腳本賦予執行權限:
# 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、 查看支持的模塊
- [root@node1 ~]# httpd -l 顯示加載的靜態模塊
- Compiled in modules:
- core.c
- mod_so.c
- http_core.c
- event.c
- [root@node1 ~]# httpd -D DUMP_MODULES 顯示加載的所有模塊
- Loaded Modules: 要有proxy模塊
- proxy_module (shared)
- proxy_http_module (shared)
- proxy_ajp_module (shared)
- proxy_balancer_module (shared)
- proxy_express_module (shared)
1.7、啓動測試apache
- [root@node1 httpd]# /etc/init.d/httpd start
- 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> 配置虛擬主機
- [root@node1 httpd]# vi extra/httpd-vhosts.conf
- ProxyVia Off 關閉正向代理
ProxyRequests Off
ProxyPreserveHost Off off 表示任何對 "tomcat.yue.com" 的請求 都定位到後端 Tomcat 的默認虛擬主機上- <VirtualHost *:80>
- ServerName tomcat.yue.com
- # DocumentRoot "/web/tomcat"
- ProxyPass / http://192.168.1.12:8080/ 把前端用戶請求的URL路徑,以哪種協議轉到後端的哪個tomcat服務器上的哪個端口上
- ProxyPa***everse / http://192.168.1.12:8080/
- </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
- [root@node1 httpd]# vi extra/httpd-vhosts.conf
- ProxyVia Off
ProxyRequests Off
ProxyPreserveHost On 定位到後端Tomcat中與當前主機名相同的虛擬主機上- <VirtualHost *:80>
- ServerName tomcat.yue.com
- # DocumentRoot "/web/tomcat"
- ProxyPass / http://192.168.1.12:8080/
- ProxyPa***everse / http://192.168.1.12:8080/
- </VirtualHost>
- [root@node1 httpd]# /etc/init.d/httpd restart
- Stopping httpd: [ OK ]
- Starting httpd: [ OK ]
測試一下效果
此時我們也可以打開Tomcat的管理器,查看Tomcat的狀態信息:
2.2使用 ajp 連接器
修改extra/httpd-vhosts.conf
- [root@node1 httpd]# vi extra/httpd-vhosts.conf
- ProxyVia Off
- ProxyRequests Off
- ProxyPreserveHost Off
- <VirtualHost *:80>
- ServerName tomcat.yue.com
- # DocumentRoot "/web/tomcat"
- ProxyPass / ajp://192.168.1.12:8009/ 注意: ajp連接器使用的是8009端口
- ProxyPa***everse / ajp://192.168.1.12:8009/
- </VirtualHost>
重啓Apache:
- [root@node1 httpd]# /etc/init.d/httpd restart
- Stopping httpd: [ OK ]
- Starting httpd: [ OK ]
測試一下:
查看此時連接的狀態信息:
3. 配置apache通過mod_jk模塊與Tomcat連接
mod_jk是ASF的一個項目,是一個工作於apache端基於AJP協議與Tomcat通信的連接器,它是apache的一個模塊,是AJP協議的客戶端(服務端是Tomcat的AJP連接器)
3.1 由於mod-jk 模塊apache並沒有自帶,所以需要手動編譯安裝
- [root@node1 tmp]# tar xf tomcat-connectors-1.2.37-src.tar.gz
- [root@node1 tmp]# cd tomcat-connectors-1.2.37-src/native/
- [root@node1 native]# ./configure --with-apxs=/usr/local/apache/bin/apxs 注意此時所在的路徑
- checking build system type... i686-pc-linux-gnu
- checking host system type... i686-pc-linux-gnu
- checking target system type... i686-pc-linux-gnu
- checking for a BSD-compatible install... /usr/bin/install -c
- checking whether build environment is sane... yes
- checking for gawk... gawk
- checking whether make sets $(MAKE)... yes
- checking for test... /usr/bin/test
- checking for grep... /bin/grep
- checking for echo... /bin/echo
- checking for sed... /bin/sed
- checking for cp... /bin/cp
- checking for mkdir... /bin/mkdir
- need to check for Perl first, apxs depends on it...
- checking for perl... /usr/bin/perl
- APRINCLUDEDIR is -I/usr/local/apr/include/apr-1 -I/usr/local/apr-util/include/apr-1
- building connector for "apache-2.0"
- ...... ......
- configure: creating ./config.status
- config.status: creating Makefile
- config.status: creating apache-1.3/Makefile
- config.status: creating apache-1.3/Makefile.apxs
- config.status: creating apache-2.0/Makefile
- config.status: creating apache-2.0/Makefile.apxs
- config.status: creating common/Makefile
- config.status: creating common/list.mk
- config.status: creating common/jk_types.h
- config.status: creating common/config.h
- config.status: executing depfiles commands
- [root@node1 native]# make && make install
3.2 apache要使用mod_jk連接器,需要在啓動時加載此連接器模塊。爲了便於管理與mod_jk模塊相關的配置,這裏使用一個專門的配置文件/etc/httpd/extra/httpd-jk.conf來保存相關指令及相關設ersFile指定的,在apache啓動時,mod_jk會掃描此文件獲取每一個worker的配置信息。
- [root@node1 httpd]# vi extra/httpd-jk.conf 內容如下:
- # Load the mod_jk
- LoadModule jk_module modules/mod_jk.so
- JkWorkersFile /etc/httpd/extra/workers.properties 每個tomcat的engine(或實例)就叫一個work,使用一個專用的配置文件記錄所有的work
- JkLogFile logs/mod_jk.log 指定mod_jk模塊的日誌文件
- JkLogLevel debug 用於指定日誌的級別(info, error, debug),第一次使用時可以打開,便於查找錯誤
- JkMount /* Tomcat_A * 表示根下的所有內容都轉發, 後端的work名稱, work的名字在tomcat的配置文件的engine 中定義--> "jvmRoute=“work_Name”"
- 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
- [root@node1 httpd]# vi extra/workers.properties
- worker.list=Tomcat_A,stat1 worker列表
- worker.Tomcat_A.port=8009
- worker.Tomcat_A.host=192.168.1.12
- worker.Tomcat_A.type=ajp13
- worker.Tomcat_A.lbfactor=1
- worker.stat1.type = status 定義了stat1 的類型
3.4 編輯Apache的主配置文件
- [root@node1 httpd] # vi /etc/httpd/httpd.conf
- 註釋掉這行:# Include /etc/httpd/extra/httpd-vhosts.conf
- 加入 :Include /etc/httpd/extra/httpd-jk.conf
- 重啓Apache
- [root@node1 httpd]# /etc/init.d/httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
3.5 編輯Tomcat的主配置文件
- [root@node2 tomcat]# vi conf/server.xml
- <Engine name="Catalina" defaultHost="localhost" jvmRoute="Tomcat_A"> 在Engine 中添加關於“Tomcat_A”的設置
- [root@node2 tomcat]# bin/catalina.sh stop
- Using CATALINA_BASE: /usr/local/tomcat
- Using CATALINA_HOME: /usr/local/tomcat
- Using CATALINA_TMPDIR: /usr/local/tomcat/temp
- Using JRE_HOME: /usr/java/jdk1.7.0_05
- Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
- [root@node2 tomcat]# bin/catalina.sh start
- Using CATALINA_BASE: /usr/local/tomcat
- Using CATALINA_HOME: /usr/local/tomcat
- Using CATALINA_TMPDIR: /usr/local/tomcat/temp
- Using JRE_HOME: /usr/java/jdk1.7.0_05
- 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 !