1、简单说明:
mod_jk是ASF的一个项目,是一个工作于Apache端基于AJP协议与Tomcat通信的连接器,是Apache的一个模块,是AJP协议的客户端,服务端是Tomcat的AJP连接器。
Web客户访问Tomcat JSP组件的两种方式:
2、演示环境:
IP |
操作系统 |
部署程序 |
192.168.1.143 |
CentOS 7.6 |
Apache |
192.168.1.144 |
CentOS 7.6 |
Tomcat |
192.168.1.145 |
CentOS 7.6 |
Tomcat |
3、192.168.1.144节点禁用HTTP/1.1连接器:
# cd /usr/local/tomcat/conf
# cp server.xml server.xml.bak
# vim server.xml,注释如下代码:
4、192.168.1.145节点禁用HTTP/1.1连接器:
# cd /usr/local/tomcat/conf
# cp server.xml server.xml.bak
# vim server.xml,注释如下代码:
5、192.168.1.144节点新增jvmRoute参数:# vim server.xml
6、192.168.1.145节点新增jvmRoute参数:# vim server.xml
7、192.168.1.144节点创建测试页:
# vim /usr/local/tomcat/webapps/ROOT/test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
color="red">TomcatA
Session ID <%= session.getId() %>
Created ON <%= session.getCreationTime() %>
8、192.168.1.145节点创建测试页:
# vim /usr/local/tomcat/webapps/ROOT/test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
color="blue">TomcatB
Session ID <%= session.getId() %>
Created ON <%= session.getCreationTime() %>
9、分别启动192.168.1.144节点和192.168.1.145节点上的Tomcat:
# catalina.sh stop # catalina.sh configtest # catalina.sh start # ss -tunlp | grep -w :8009
10、192.168.1.143节点安装Apache:
# yum -y install httpd
# cd /etc/httpd/conf
# cp httpd.conf httpd.conf.bak
# vim httpd.conf,新增代码:ServerName localhost:80
# httpd -t # systemctl start httpd.service # ss -tunlp | grep -w :80
11、192.168.1.143节点配置status状态页面:
# vim /etc/httpd/conf/httpd.conf,末尾新增如下代码:
SetHandler server-status
Require all granted
# httpd -t # systemctl reload httpd.service # ss -tunlp | grep -w :80
本地浏览器访问:
192.168.1.143
192.168.1.143/server-status
12、192.168.1.143编译安装tomcat-connectors(下载地址http://tomcat.apache.org/download-connectors.cgi):
# yum -y install gcc gcc-c++ httpd-devel
# ls /etc/httpd/modules | grep mod_jk.so //默认没有此模块
# tar -xf tomcat-connectors-1.2.46-src.tar.gz -C /usr/src
# cd /usr/src/tomcat-connectors-1.2.46-src/native
# which apxs --> /usr/bin/apxs
# ./configure --with-apxs=/usr/bin/apxs
# make && make install
# ls /etc/httpd/modules | grep mod_jk.so
13、192.168.1.143配置mod_jk模块,实现TomcatB为TomcatA的Hot Standby热备
(1)创建httpd-jk.conf配置文件:# vim /etc/httpd/conf.d/mod_jk.conf
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf.d/workers.properties
JkMountFile conf.d/uriworkermap.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkShmFile logs/mod_jk.shm
JkMount /* lbcluster
JkMount /jk-status jk-status
备注:常用指令说明
Ø JkWorkersFile conf.d/workers.properties:JkWorkersFile用于定义worker实例的工作属性的配置文件
Ø JkLogFile logs/mod_jk.log:JkLogFile用于指定mod_jk模块的日志文件
Ø JkLogLevel info:JkLogLevel用于指定日志的级别
Ø JkMount /* lbcluster:JkMount用于控制URL与worker实例的对应关系
(2)创建workers.properties配置文件:# vim /etc/httpd/conf.d/workers.properties
worker.list=lbcluster,jk-status
worker.lbcluster.balance_workers=TomcatA,TomcatB
worker.TomcatA.type=ajp13
worker.TomcatA.host=192.168.1.144
worker.TomcatA.port=8009
worker.TomcatA.lbfactor=1
worker.TomcatB.type=ajp13
worker.TomcatB.host=192.168.1.145
worker.TomcatB.port=8009
worker.TomcatB.lbfactor=1
worker.lbcluster.type=lb
worker.jk-status.type=status
worker.TomcatA.redirect=TomcatB
worker.TomcatB.activation=disabled
worker.lbcluster.sticky_session=0
备注:常用指令说明
Ø worker.TomcatA.lbfactor=1:lbfactor负载均衡因数,数值越大,分配到此节点的请求越多
Ø worker.TomcatA.type=ajp13:根据工作机制的不同,worker有多种不同类型的type,这是需要为每个worker定义的一项属性。常见的type类型如下:
² ajp13:表示当前worker为一个运行着的Tomcat实例
² lb:即load balancing,专用于负载均衡场景中的worker,此worker并不真正负责处理用户请求,而是将用户请求调度给其它类型为ajp13的worker
² status:显示分布式环境中各实际worker工作状态的特殊worker,它不处理任何请求,也不关联到任何实际工作的worker实例
(3)创建uriworkermap.properties配置文件:# vim /etc/httpd/conf.d/uriworkermap.properties
/*=lbcluster
/jk-status=jk-status
!/*.html=lbcluster
!/*.htm=*
!/*.gif=*
!/*.jpg=*
!/*.jpeg=*
!/*.png=*
!/*.bmp=*
!/*.ico=*
!/*.mp3=*
!/*.mp4=*
!/*.mid=*
!/*.wav=*
!/*.flv=*
!/*.swf=*
!/*.rar=*
!/*.zip=*
!/*.txt=*
!/*.md=*
!/*.doc=*
!/*.docx=*
!/*.xls=*
!/*.xlsx=*
!/*.js=*
!/*.css=*
!/*.exe=*
!/*.msi=*
备注:常用指令说明
Ø /*=lbcluster:所有请求都转发给lbcluster负载均衡控制器处理
Ø /jk-status=jk-status:包含jk-status的请求交由jk-status这个worker处理
Ø !/*.html=lbcluster:所有以.html格式结尾的请求不交由lbcluster处理
Ø !/*.htm=*:所有以.htm格式结尾的请求不交由任何worker实例处理
(4)192.168.1.143节点创建用于测试的静态页面:
# echo "/var/www/html/a.html in 192.168.1.143
" > /var/www/html/a.html
# echo "/var/www/html/b.htm in 192.168.1.143
" > /var/www/html/b.htm
(5)192.168.1.143节点配置jk-status访问控制:
# vim /etc/httpd/conf/httpd.conf,末尾新增如下代码:
JkMount jk-status
Options MultiViews
AuthType Basic
AuthName "Marion"
AuthUserFile conf.d/.htpasswd
require valid-user granted
# htpasswd -c /etc/httpd/conf.d/.htpasswd marion
# httpd -t # systemctl reload httpd.service # ss -tunlp | grep -w :80
本地火狐浏览器访问(效果比Google Chrome浏览器明显):http://192.168.1.143/jk-status
备注:上述页面可以启动或者停止集群中的服务器,也可以修改负载均衡器的配置
(6)本地浏览器验证热备效果:
192.168.1.143
192.168.1.143/server-status
192.168.1.143/a.html
192.168.1.143/b.htm
192.168.1.143/test.jsp,无论怎么刷新页面,显示的都是TomcatA,且Session ID保持不变
http://192.168.1.143/jk-status
停止192.168.1.144节点的TomcatA,无论怎么刷新页面,显示的都是TomcatB,且Session ID保持不变
192.168.1.143/test.jsp
http://192.168.1.143/jk-status
恢复192.168.1.144节点的TomcatA,无论怎么刷新页面,显示的都是TomcatA,且Session ID保持不变
192.168.1.143/test.jsp
http://192.168.1.143/jk-status
备注:热备场景中只有在TomcatA不可用的情况下才会向TomcatB发起请求,一旦TomcatA恢复正常,TomcatB就立即停止处理请求
14、192.168.1.143配置mod_jk模块,实现TomcatA、TomcatB基于实际流量大小进行负载均衡
(1)httpd-jk.conf和uriworkermap.properties配置文件内容保持不变
(2)修改workers.properties配置文件:# vim /etc/httpd/conf.d/workers.properties
删除如下2行:
worker.TomcatA.redirect=TomcatB
worker.TomcatB.activation=disabled
替换为:
worker.lbcluster.sticky_session_force=0
worker.lbcluster.method=T
备注:常用指令说明
Ø worker.lbcluster.sticky_session=0:默认值为1 | true,表示是否启用session会话保持,如果后端各worker实例之间支持session复制,则可以将此属性值设为0
Ø worker.lbcluster.sticky_session_force=0:默认值为0 | false,如果集群中某台服务器多次请求没有响应,将转发当前的请求到其它服务器上处理,worker.lbcluster.sticky_session_force=1只有在worker.lbcluster.sticky_session=1时才生效
Ø worker.lbcluster.method=R:常用方法为R、T或B,默认为R[equest],即根据请求个数进行调度;T[raffic]表示根据已经发送给worker的实际流量大小进行调度;B[usyness]表示根据实际负载情况进行调度
# httpd -t # systemctl reload httpd.service # ss -tunlp | grep -w :80
(3)本地浏览器验证负载均衡效果:
192.168.1.143/test.jsp
刷新页面,轮询显示,且Session ID一直在变:
192.168.1.143/jk-status
15、192.168.1.143配置mod_jk模块,实现TomcatA、TomcatB负载均衡和session会话保持
(1)httpd-jk.conf和uriworkermap.properties配置文件内容保持不变
(2)修改workers.properties配置文件:# vim /etc/httpd/conf.d/workers.properties
删除如下2行:
worker.lbcluster.method=T
worker.lbcluster.sticky_session=0
替换为:
worker.lbcluster.sticky_session=1
# httpd -t # systemctl reload httpd.service # ss -tunlp | grep -w :80
(3)本地浏览器验证负载均衡和session会话保持效果:
192.168.1.143/test.jsp,无论怎么刷新页面,页面内容和Session ID均不会改变:
192.168.1.143/jk-status
# vim /etc/httpd/conf.d/workers.properties,目前配置如下所示:
worker.lbcluster.sticky_session=1
worker.lbcluster.sticky_session_force=0
停止192.168.1.145节点的TomcatB,无论怎么刷新页面,显示的都是TomcatA,且Session ID保持不变
192.168.1.143/test.jsp
192.168.1.143/jk-status
恢复192.168.1.145节点的TomcatB,无论怎么刷新页面,显示的还是TomcatA,且Session ID保持不变
192.168.1.143/test.jsp
192.168.1.143/jk-status
# vim /etc/httpd/conf.d/workers.properties,修改为如下配置:
worker.lbcluster.sticky_session=1
worker.lbcluster.sticky_session_force=1
192.168.1.143/test.jsp,无论怎么刷新页面,页面内容和Session ID都保持不变:
192.168.1.143/jk-status
停止192.168.1.144节点的TomcatA,无论怎么刷新页面,提示的都是503错误
192.168.1.143/test.jsp
192.168.1.143/jk-status
恢复192.168.1.144节点的TomcatA,无论怎么刷新页面,显示的还是TomcatA,且Session ID保持不变
192.168.1.143/test.jsp
192.168.1.143/jk-status