Apache + Tomcat基于mod_jk模块实现反代、动静分离、热备和负载均衡

1、简单说明:

mod_jkASF的一个项目,是一个工作于Apache端基于AJP协议与Tomcat通信的连接器,是Apache的一个模块,是AJP协议的客户端,服务端是TomcatAJP连接器。

image.png

Web客户访问Tomcat JSP组件的两种方式:

image.png

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,注释如下代码:

<!-- <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> -->

4、192.168.1.145节点禁用HTTP/1.1连接器:

# cd /usr/local/tomcat/conf

# cp server.xml server.xml.bak

# vim server.xml,注释如下代码:

<!-- <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> -->

5、192.168.1.144节点新增jvmRoute参数:# vim server.xml

<Engine name="Catalina" defaultHost="localhost">修改为

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">

6、192.168.1.145节点新增jvmRoute参数:# vim server.xml

<Engine name="Catalina" defaultHost="localhost">修改为

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB">

7、192.168.1.144节点创建测试页:

# vim /usr/local/tomcat/webapps/ROOT/test.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>

<head><title>TomcatA</title></head>

<body>

<h1><font color="red">TomcatA</font></h1>

<table border="1">

<tr>

<td>Session ID</td>

<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created ON</td>

<td><%= session.getCreationTime() %></td>

</tr>

</table>

</body>

</html>

8、192.168.1.145节点创建测试页:

# vim /usr/local/tomcat/webapps/ROOT/test.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>

<head><title>TomcatB</title></head>

<body>

<h1><font color="blue">TomcatB</font></h1>

<table border="1">

<tr>

<td>Session ID</td>

<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created ON</td>

<td><%= session.getCreationTime() %></td>

</tr>

</table>

</body>

</html>

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,末尾新增如下代码:

<Location /server-status>

SetHandler server-status

Require all granted

</Location>

# httpd -t  # systemctl reload httpd.service  # ss -tunlp | grep -w :80

本地浏览器访问:

192.168.1.143

image.png

192.168.1.143/server-status

image.png

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

image.png

13、192.168.1.143配置mod_jk模块,实现TomcatBTomcatAHot 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.propertiesJkWorkersFile用于定义worker实例的工作属性的配置文件

Ø  JkLogFile logs/mod_jk.logJkLogFile用于指定mod_jk模块的日志文件

Ø  JkLogLevel infoJkLogLevel用于指定日志的级别

Ø  JkMount /* lbclusterJkMount用于控制URLworker实例的对应关系

(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=1lbfactor负载均衡因数,数值越大,分配到此节点的请求越多

Ø  worker.TomcatA.type=ajp13:根据工作机制的不同,worker有多种不同类型的type,这是需要为每个worker定义的一项属性。常见的type类型如下:

  ²  ajp13:表示当前worker为一个运行着的Tomcat实例

  ²  lb:即load balancing,专用于负载均衡场景中的worker,此worker并不真正负责处理用户请求,而是将用户请求调度给其它类型为ajp13worker

    ²  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 "<h3>/var/www/html/a.html in 192.168.1.143</h3>" > /var/www/html/a.html

# echo "<h3>/var/www/html/b.htm in 192.168.1.143</h3>" > /var/www/html/b.htm

(5)192.168.1.143节点配置jk-status访问控制:

# vim /etc/httpd/conf/httpd.conf,末尾新增如下代码:

<Location /jk-status>

JkMount jk-status

Options MultiViews

AuthType Basic

AuthName "Marion"

AuthUserFile conf.d/.htpasswd

require valid-user granted

</Location>

# htpasswd -c /etc/httpd/conf.d/.htpasswd marion

image.png

# httpd -t  # systemctl reload httpd.service  # ss -tunlp | grep -w :80

本地火狐浏览器访问(效果比Google Chrome浏览器明显):http://192.168.1.143/jk-status

image.png

image.png

image.png

备注:上述页面可以启动或者停止集群中的服务器,也可以修改负载均衡器的配置

(6)本地浏览器验证热备效果:

192.168.1.143

image.png

192.168.1.143/server-status

image.png

192.168.1.143/a.html

image.png

192.168.1.143/b.htm

image.png

192.168.1.143/test.jsp无论怎么刷新页面,显示的都是TomcatA,且Session ID保持不变

image.png

http://192.168.1.143/jk-status

image.png

停止192.168.1.144节点的TomcatA无论怎么刷新页面,显示的都是TomcatB,且Session ID保持不变

192.168.1.143/test.jsp

image.png

http://192.168.1.143/jk-status

image.png

恢复192.168.1.144节点的TomcatA无论怎么刷新页面,显示的都是TomcatA,且Session ID保持不变

192.168.1.143/test.jsp

image.png

http://192.168.1.143/jk-status

image.png

备注:热备场景中只有在TomcatA不可用的情况下才会向TomcatB发起请求,一旦TomcatA恢复正常,TomcatB就立即停止处理请求

14、192.168.1.143配置mod_jk模块,实现TomcatATomcatB基于实际流量大小进行负载均衡

(1)httpd-jk.confuriworkermap.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:常用方法为RTB,默认为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

image.png

image.png

刷新页面,轮询显示,且Session ID一直在变:

image.png

image.png

192.168.1.143/jk-status

image.png

15、192.168.1.143配置mod_jk模块,实现TomcatATomcatB负载均衡和session会话保持

(1)httpd-jk.confuriworkermap.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均不会改变:

image.png

192.168.1.143/jk-status

image.png

# 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

image.png

192.168.1.143/jk-status

image.png

恢复192.168.1.145节点的TomcatB无论怎么刷新页面,显示的还是TomcatA,且Session ID保持不变

192.168.1.143/test.jsp

image.png

192.168.1.143/jk-status

image.png

# 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都保持不变:

image.png

192.168.1.143/jk-status

image.png

停止192.168.1.144节点的TomcatA无论怎么刷新页面,提示的都是503错误

192.168.1.143/test.jsp

image.png

192.168.1.143/jk-status

image.png

恢复192.168.1.144节点的TomcatA无论怎么刷新页面,显示的还是TomcatA,且Session ID保持不变

192.168.1.143/test.jsp

image.png

192.168.1.143/jk-status

image.png 

 


猜你喜欢

转载自blog.51cto.com/qiuyue/2334000
今日推荐