一、 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服务器上的哪个端口上
- ProxyPassReverse / 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/
- ProxyPassReverse / 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端口
- ProxyPassReverse / 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 !