您的位置:首页 > 运维架构 > Tomcat

如何编译Apache的JK模块基于AJP协议连接Tomcat,实现负载均衡。

2014-08-12 22:16 851 查看
nginx,Apache,HAProxy都可以通过http协议将请求代理至后端的tomcat,但是只有Apache可以支持更高效的AJP协议连接tomcat,接下来我们来看看如何实现吧。
实验环境:RHEL6.4
admin1.tuchao.com 192.168.18.201 //tomcat服务器
admin2.tuchao.com 192.168.18.202 //tomcat服务器
admin3.tuchao.com 192.168.18.203 //Apache服务器
jk模块源码包下载地址:http://tomcat.apache.org/download-connectors.cgi

jk模块文档地址:http://tomcat.apache.org/connectors-doc-archive/jk2/jk/aphowto.html
安装tomcat(略) 配置serve.xml在Engine标签加入一个jvmRoute然后启动tomcat。




由于在编译jk模块的时候要指定apxs程序的位置,如果没有这个程序,则安装httpd-devel,apr-devel,apr-util-devel。
yum install httpd-devel apr-devel apr-util-devel -y

查看apxs具体位置。
rpm -ql httpd-devel



解压源码包,开始编译。
tar xf tomcat-connectors-1.2.37-src.tar.gz

cd tomcat-connectors-1.2.37-src/native/

./configure--with-apxs=/usr/sbin/apxs

make && make install

安装完成




配置启用此模块,定义一个配置文件来保存模块相关指令
vim /etc/httpd/conf.d/mod_jk.conf
在文件中输入以下内容:
LoadModule jk_module /usr/lib/httpd/modules/mod_jk.so //装载jk模块
JkWorkersFile /etc/httpd/conf.d/workers.properties //定义工作属性的配置文件
JkLogFile logs/mod_jk.log //日志文件
JkLogLevel debug //日志级别
JkMount /* TomcatA //将哪个路径转发至哪个work实例,实例名称要基于后端tomcat jvmRoute配置。
JkMount /status/ stat1

创建jk模块工作属性的配置文件。
vim /etc/httpd/conf.d/workers.properties
在文件中输入以下内容:
worker.list=TomcatA,stat1 //定义work实例列表
worker.TomcatA.port=8009 //指定tomcatA所监听的端口,这里worker实例的名称要基于后端tomcat服务器,server.xml 配置文件 Engine标签中jvmRoute指令的定义。

worker.TomcatA.host= 192.168.18.201 //主机地址
worker.TomcatA.type=ajp13 //指定协议
worker.TomcatA.lbfactor=1 //权重
worker.stat1.type= status //配置输出状态接口
配置完成后保存,启动httpd。

work常见的工作类型:
ajp13::使用ajp13协议连接tomcat
lb:使用负载均衡
status:用于显示环境中各实际worker工作状态。
worker其它常见的属性说明:
host:Tomcat 7的worker实例所在的主机;
port:Tomcat 7实例上AJP1.3连接器的端口;
connection_pool_minsize:最少要保存在连接池中的连接的个数;默认为pool_size/2;
connection_pool_timeout:连接池中连接的超时时长;
mount:可以定义请求的路径转发至某个实例,如果有多个则使用空格格开;此属性可以由JkMount指令替代;
retries:错误发生时的重试次数;
socket_timeout:mod_jk等待worker响应的时长,默认为0,即无限等待;
socket_keepalive:是否启用keep alive的功能,1表示启用,0表示禁用;
lbfactor:worker的权重,可以在负载均衡的应用场景中为worker定义此属性;

现在我们尝试访问Apache服务器的地址。




配置进阶—实现负载均衡。
admin1主机:
配置Engine
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA" >

添加虚拟主机




创建测试页面 vim /usr/local/tomcat/webapps/luntan/index.jsp
复制以下代码:
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA </font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("abc","abc"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
测试页面




admin2主机:
配置Engine
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatB" >
添加虚拟主机




创建测试页面 vim /web/index.jsp
复制以下代码:
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="blue">TomcatB </font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("abc","abc"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
测试页面



admin3主机:

编辑Apache jk模块配置文件 vim /etc/httpd/conf.d/mod_jk.conf
LoadModule jk_module /usr/lib/httpd/modules/mod_jk.so
JkWorkersFile /etc/httpd/conf.d/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMount /* lbcluster1 //将哪个路径转发至哪个work实例
JkMount /status/ stat1

编辑jk模块工作属性配置文件 vim /etc/httpd/conf.d/workers.properties
worker.list = lbcluster1,stat1 //定义work实例
worker.TomcatA.type = ajp13
worker.TomcatA.host = 192.168.18.201
worker.TomcatA.port = 8009 //这里定义的端口要和tomcat AJP协议监听的端口一致。

worker.TomcatA.lbfactor = 1
worker.TomcatB.type = ajp13
worker.TomcatB.host = 192.168.18.202
worker.TomcatB.port = 8009
worker.TomcatB.lbfactor = 1 //定义权重
worker.lbcluster1.type = lb //定义工作类型
worker.lbcluster1.sticky_session = 1 //启用会话保持
worker.lbcluster1.balance_workers = TomcatA, TomcatB //定义后端实例,这里worker实例的名称要基于后端tomcat服务器,server.xml 配置文件 Engine标签中jvmRoute指令的定义。注意在这里实例名第一个字母要大写,不然会出错。
worker.lbcluster1.method = R //定义调度算法,可以设定为R、T或B;默认为R,即根据请求的个数进行调度;T表示根据已经发送给worker的实际流量大小进行调度;B表示根据实际负载情况进行调度。
worker.stat1.type = status
配置完成后保存,重启httpd服务。
修改本机的hosts文件,www.tuchao.com 192.168.18.203

访问www.tuchao.com





刷新,由于这里启用了会话保持的功能,要多刷几次才会切换。



实验完成,我admin1主机tomcat http协议监听的端口是8080,而admin2主机tomcat http协议监听的端口我改成了80,在负载均衡转发的时候却毫不受影响,应该是因为Apache是通过AJP协议8009端口与tomcat通信的,所以tomcat服务http协议监听在哪个端口无所谓。

哈哈,不知道这样理解是不是对了。

本文出自 “突破舒适区” 博客,请务必保留此出处http://tchuairen.blog.51cto.com/3848118/1539166
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: