Apache+Tomcat的架构可以充分发挥各自的优点,消除各自的缺点。Apache做为一个高效的Web服务器只支持静态网页,无法处理动态网页,而Tomcat可以处理基于JAVA的动态页面,却在静态页面的处理上效率不高;Apache的配置简单,功能强大,而Tomcat的可配置性差,且性能无法与Apache相提并论。
1、Apache与Tomcat的连接器
Apache通过连接器与Tomcat进行连接,常用的连接器有以下四种:
- mod_jk2:比较早的一种连接器,在动静页面过滤上可以使用正则表达式,配置灵活。但是mod_jk2已经没有开发人员支持,停止版本更新了
- mod_jk:mod_jk2的继承者,支持Apache 1.x和Apache 2.x版本,是最常用的也是效率最高的连接器
- proxy_ajp:专门为整合Tomcat而开发的一个连接器,通过ajp协议代理对于Tomcat的请求
- http_proxy:通过普通反向代理的方式与Tomcat进行连接,实现的功能少且效率低
这里将介绍通过mod_jk连接器来连接Tomcat。
2、Apache+Tomcat实现动静分离
这里通过一个例子的方式来介绍Apache+Tomcat来实现Web的动静分离。
实验环境:
- 操作系统CentOS 7.6.1810,IP地址192.168.0.88
- JDK版本1.8.0_191,安装路径/usr/local/jdk
- Tomcat版本8.5.37,安装路径/usr/local/tomcat
- Apache版本2.4.37,安装路径/usr/local/httpd
- Tomcat Connectors(mod_jk)版本1.2.46
Apache与Tomcat安装在同一台主机,通过mod_jk进行连接,实现Web的动静分离。
2.1、安装JDK和Tomcat
JDK和Tomcat的安装参考https://www.cnblogs.com/yu2006070-01/p/10223656.html。
2.2、安装Tomcat Connectors(mod_jk)
这里我们使用Tomcat Connectors的源码进行安装,安装前先通过YUM安装以下依赖包:
[root@localhost apps]# yum install libtool autoconf
解压Tomcat Connectors源码包并进入源码目录,Tomcat Connectors的源码安装有所不同,必须先通过源码目录下的native目录中的buildconf.sh脚本生成configure脚本后才可以进行编译安装:
[root@localhost tomcat-connectors-1.2.46-src]# cd native/ [root@localhost native]# ./buildconf.sh
执行configure,并调用Apache的apxs来生成一个Apache模块:
[root@localhost native]# ./configure --with-apxs=/usr/local/httpd/bin/apxs
configure运行完毕无报错后,执行:
[root@localhost native]# make && make install
命令执行完毕后将会在Apache安装目录下的modules目录中生成一个名为mod_jk.so的模块文件,至此,Tomcat Connectors安装完毕。
2.3、使用mod_jk连接器
要使用mod_jk必须先在Apache中启用mod_jk.so模块,在httpd.conf文件中添加:
LoadModule jk_module modules/mod_jk.so
继续向httpd.conf中添加如下配置:
JkWorkersFile /usr/local/httpd/conf/workers.properties JkMountFile /usr/local/httpd/conf/uriworkermap.properties JkLogFile /usr/local/httpd/logs/mod_jk.log JkLogLevel info JkLogStampformat "[%a %b %d %H:%M:%S %Y]"
- JkWorkersFile:定义Tomcat workers配置文件,在该文件中可以定义连接到哪台运行Tomcat的主机
- JkMountFile:定义Tomcat workers的URL映射文件,即页面过滤规则
- JkLogFile:定义mod_jk的日志文件
- JkLogLevel:定义mod_jk的日志输出等级
- JkLogStampformat:定义mod_jk的日志输出格式
接下来需要创建Tomcat workers。Tomcat workers是一个服务于Web Server、等待执行servlet/JSP的Tomcat实例。Tomcat workers需要workers.properties、uriworkermap.properties和mod_jk.log三个文件,mod_jk.log会在Apache启动时自动创建,这里只需要创建workers.properties和uriworkermap.properties即可。
workers.properties配置文件
workers.properties文件用于指定连接一台或一组Tomcat主机,配置如下(这里设置连接本机的Tomcat):
worker.list=tomcat1 # 定义一台或一组Tomcat主机 worker.tomcat1.port=8009 # 连接Tomcat的端口,mod_jk通过ajp协议连接Tomcat,默认端口为8009 worker.tomcat1.host=localhost # Tomcat主机的IP地址或主机名 worker.tomcat1.type=ajp13 # 连接Tomcat时使用的方式,常用的值有:ajp13 - 常用;lb - 负载均衡;status - 状态页 worker.tomcat1.lbfactor=1 # Tomcat主机的权重
uriworkermap.properties配置文件
uriworkermap.properties是Tomcat worker的URL映射文件,用来定义哪些URL由Tomcat处理,哪些由Apache处理;mod_jk会定期检查该文件是否有更新,单独使用该文件可以在修改规则之后不用重启Apache;该文件支持正则。
这里配置.html、.jpg、.css、.js交由Apache处理,其他全部交由Tomcat处理,配置如下:
/*=tomcat1 !/*.html=tomcat1 !/*.jpg=tomcat1 !/*.css=tomcat1 !/*.js=tomcat1
注意:!表示取反,具有高优先级
2.4、Apache配置虚拟主机
在Apache中配置一个域名为www.abc.com的虚拟主机,虚拟主机根目录为/data/www.abc.com:
<VirtualHost *:80> ServerAdmin xxx DocumentRoot "/data/www.abc.com" ServerName www.abc.com ServerAlias abc.com ErrorLog "logs/www.abc.com-error_log" CustomLog "logs/www.abc.com-access_log" common <Directory "/data/www.abc.com"> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> JkMountFile /usr/local/httpd/conf/uriworkermap.properties </VirtualHost>
2.5、Tomcat配置虚拟主机
Tomcat中的虚拟主机必须配置与Apache的虚拟主机相同的域名,并且根目录必须指向Apache对应虚拟主机的根目录。配置如下:
<Host name="www.abc.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="/data/www.abc.com"/> </Host>
2.6、验证配置
在/data/www.abc.com目录下有index.html和info.jsp两个文件,info.jsp文件为JSP探针文件,index.html文件内容如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>www.abc.com</h3> <h4>这是一个虚拟主机</h4> </body> </html>
此时,配置完mod_jk模块后尚未重启Apache,配置还未生效,这里首先分别访问Apache和Tomcat的虚拟主机:
www.abc.com
www.abc.com:8080/info.jsp
重启Apache使mod_jk模块生效,然后访问:
www.abc.com
www.abc.com/info.jsp
3、Apache+Tomcat实现Tomcat的负载均衡
3.1、共享虚拟主机根目录
多台Tomcat可通过NFS共享一个虚拟主机根目录。注意,每台Tomcat访问NFS时使用的UID和GID应该一致,以避免权限的问题。
3.2、workers.properties配置
这里添加了一台IP地址为192.168.0.110的Tomcat主机与当前主机结合实现负载均衡,此时需要修改workers.properties文件的内容,如下:
worker.list=loadbalancer worker.tomcat1.port=8009 worker.tomcat1.host=192.168.0.88 worker.tomcat1.type=ajp13 worker.tomcat1.lbfactor=1 worker.tomcat2.port=8009 worker.tomcat2.host=192.168.0.110 worker.tomcat2.type=ajp13 worker.tomcat2.lbfactor=1 work.loadbalancer.type=lb work.loadbalancer.balance_workers=tomcat1,tomcat2
3.3、uriworkermap.properties配置
由于我们修改了worker名称,所以uriworkermap.properties文件也必须做相应的更改,内容如下:
/*=loadbalancer !/*.html=loadbalancer !/*.jpg=loadbalancer !/*.js=loadbalancer
至此,Tomcat的负载均衡配置完毕。
4、mod_jk自带监控页的启用
与Apache一样,mod_jk也自带了一个状态监控页,可以通过以下配置启动:
# 在workers.properties文件中进行配置 worker.自定义名称.type=status # 定义这个worker为状态监控 worker.自定义名称.mount=URL # 通过这里指定的URL可以访问监控页 # 设置完成后在worker.list中进行调用即可