青蛙学Linux—Apache+Tomcat实现动静分离以及负载均衡

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

1

www.abc.com:8080/info.jsp

5

重启Apache使mod_jk模块生效,然后访问:

www.abc.com

3

www.abc.com/info.jsp

4

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中进行调用即可
原文地址:https://www.cnblogs.com/yu2006070-01/p/10315126.html