基于apache的mod_jk模块和mod_proxy模块实现tomcat负载均衡

集群 struggling 10653次浏览 0个评论

前面已经说明了如何使用mod_jk和mod_proxy模块连接Tomcat。没有看的请点击 使用apache和nginx连接tomcat。下面将介绍基于apache的mod_jk模块和mod_proxy模块实现tomcat负载均衡。

bf74c81a48479e00a108e63e05f53e8a

<code>
规划:

     前段代理: 外网IP:192.168.1.210  内网IP:172.16.1.110
     后端TomcatA  IP:172.16.1.111
     后端TomcatB  IP:172.16.1.112
</code>

一,基于apache的mod_jk模块实现tomcat负载均衡

配置基于mod_jk的负载均衡

1、 为了避免用户直接访问后端Tomcat实例,影响负载均衡的效果,建议在Tomcat 7的各实例上禁用HTTP/1.1连接器。

2、为每一个Tomcat 7实例的引擎添加jvmRoute参数,并通过其为当前引擎设置全局惟一标识符。如下所示。需要注意的是,每一个实例的jvmRoute的值均不能相同。

 

先修改配置文件:

<code>
[root@node1 conf.d]# cd /etc/httpd/conf.d/
[root@node1 conf.d]# vim mod_jk.conf
# Load the mod_jk
LoadModule  jk_module  modules/mod_jk.so
JkWorkersFile  /etc/httpd/conf.d/workers.properties
JkLogFile  logs/mod_jk.log
JkLogLevel  notice
JkMount  /*  lbcA    
JkMount  /status/  statA
</code>

编辑/etc/httpd/conf.d/workers.properties,添加如下内容:

<code>
[root@node1 conf.d]# vim workers.properties 
worker.list = lbcA,statA
worker.TomcatA.type = ajp13
worker.TomcatA.host = 172.16.1.111
worker.TomcatA.port = 8009
worker.TomcatA.lbfactor = 1 
worker.TomcatB.type = ajp13
worker.TomcatB.host = 172.16.1.112
worker.TomcatB.port = 8009
worker.TomcatB.lbfactor = 1           #权重
worker.lbcA.type = lb
worker.lbcA.sticky_session = 0         #保持会话功能,1为启用
worker.lbcA.balance_workers = TomcatA,TomcatB
worker.statA.type = status
</code>

配置后端TomcatA:

<code>
[root@localhost webapps]# cd  /usr/local/tomcat/webapps/
[root@localhost webapps]# mkdir testapp
[root@localhost webapps]# cd testapp/
[root@localhost testapp]# ls
[root@localhost testapp]# mkdir -pv WEB-INF/{classes,lib}
mkdir: created directory `WEB-INF'
mkdir: created directory `WEB-INF/classes'
mkdir: created directory `WEB-INF/lib'
[root@localhost testapp]#vim  index.jsp    #添加如下代码
</code>

<%@ page language=”java” %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font   color=”red”>TomcatA.feiyu.com</font></h1>
<table align=”centre” border=”1″>
<tr>
<td>Session ID</td>
<% session.setAttribute(“feiyu.com”,”feiyu.com”); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>

<code>
[root@localhost testapp]# vim /usr/local/tomcat/conf/server.xml   #在engine行后作如下修改,与前端代理所定义的保持一致
</code>

 

<code>
[root@localhost testapp]# catalina.sh stop
[root@localhost testapp]# catalina.sh start
</code>

以同样的方式配置后端TomcatB:

<code>
[root@localhost webapps]# cd  /usr/local/tomcat/webapps/
[root@localhost webapps]# mkdir testapp
[root@localhost webapps]# cd testapp/
[root@localhost testapp]# ls
[root@localhost testapp]# mkdir -pv WEB-INF/{classes,lib}
mkdir: created directory `WEB-INF'
mkdir: created directory `WEB-INF/classes'
mkdir: created directory `WEB-INF/lib'
[root@localhost testapp]#vim  index.jsp    #添加如下代码,与上面代码有点不同
</code>

<%@ page language=”java” %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font   color=”red”>TomcatB.feiyu.com</font></h1>
<table align=”centre” border=”1″>
<tr>
<td>Session ID</td>
<% session.setAttribute(“feiyu.com”,”feiyu.com”); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>

<code>
[root@localhost testapp]# vim /usr/local/tomcat/conf/server.xml      #TomcatB
</code>

 

<code>
[root@localhost testapp]# catalina.sh stop
[root@localhost testapp]# catalina.sh start
</code>

启动代理服务器apache:

<code>
[root@node1 ~]# curl -I 172.16.1.111:8080/testapp   
HTTP/1.1 302 Found
Server: Apache-Coyote/1.1
Location: http://172.16.1.111:8080/testapp/
Transfer-Encoding: chunked
Date: Sat, 15 Aug 2015 16:57:25 GMT

[root@node1 ~]# curl -I 172.16.1.112:8080/testapp
HTTP/1.1 302 Found
Server: Apache-Coyote/1.1
Location: http://172.16.1.112:8080/testapp/
Transfer-Encoding: chunked
Date: Sat, 15 Aug 2015 16:57:30 GMT

[root@node1 ~]# service httpd start
</code>

然后再浏览器中访问,刷新会出现两个不同的页面如下所示:

正常2

正常A

如果出现以下页面则说明Apache与tomcat没有连接成功,Apache配置文件有问题:

错误1

修改配置文件,启用会话保持功能:

<code>
worker.list = lbcA,statA
worker.TomcatA.type = ajp13
worker.TomcatA.host = 172.16.1.111
worker.TomcatA.port = 8009
worker.TomcatA.lbfactor = 1 
worker.TomcatB.type = ajp13
worker.TomcatB.host = 172.16.1.112
worker.TomcatB.port = 8009
worker.TomcatB.lbfactor = 1 
worker.lbcA.type = lb
worker.lbcA.sticky_session =  1    #修改此处为1
worker.lbcA.balance_workers = TomcatA,TomcatB
worker.statA.type = status
</code>

重启,刷新后页面则不会再改变。

查看mod_jk的status页面,如下所示:

mod_jk status

worker其它常见的属性说明:

<code>
◇ ajp13:此类型表示当前worker为一个运行着的Tomcat实例。

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

◇   status:用户显示分布式环境中各实际worker工作状态的特殊worker,它不处理任何请求,也不关联到任何实际工作的worker实例。具体示例如请参见后文中的配置。

◇ host:Tomcat 7的worker实例所在的主机;

◇ port:Tomcat 7实例上AJP1.3连接器的端口;

◇ connection_pool_minsize:最少要保存在连接池中的连接的个数;默认为pool_size/2;

◇ connection_pool_timeout:连接池中连接的超时时长;

◇ mount:由当前worker提供的context路径,如果有多个则使用空格格开;此属性可以由JkMount指令替代;

◇ retries:错误发生时的重试次数;

◇ socket_timeout:mod_jk等待worker响应的时长,默认为0,即无限等待;

◇ socket_keepalive:是否启用keep alive的功能,1表示启用,0表示禁用;

◇ lbfactor:worker的权重,可以在负载均衡的应用场景中为worker定义此属性;

◇balance_workers:用于负载均衡模式中的各worker的名称列表,需要注意的是,出现在此处的worker名称一定不能在任何worker.list属性列表中定义过,并且worker.list属性中定义的worker名字必须包含负载均衡worker。具体示例请参见后文中的定义。

◇ method:可以设定为R、T或B;默认为R,即根据请求的个数进行调度;T表示根据已经发送给worker的实际流量大小进行调度;B表示根据实际负载情况进行调度。

◇sticky_session:在将某请求调度至某worker后,源于此址的所有后续请求都将直接调度至此worker,实现将用户session与某worker绑定。默认为值为1,即启用此功能。如果后端的各worker之间支持session复制,则可以将此属性值设为0。
</code>

二,基于apache的mod_proxy模块实现tomcat负载均衡

<code>
[root@node1 conf.d]# mv mod_jk.conf  mod_jk.conf.bak

[root@node1 conf.d]# mv mod_proxy.conf.bak mod_proxy.conf

[root@node1 conf.d]# vim mod_proxy.conf
</code>

ProxyVia on
Proxyrequests off
ProxyPreserveHost on

<Proxy balancer://lb>     #使用balancer协议,lbcluster1是自己定义的
BalancerMember http://172.16.1.111:8080 loadfactor=1 route=TomcatA
BalancerMember http://172.16.1.112:8080 loadfactor=1 route=TomcatB

</Proxy>

<Location  /lbmanager>
SetHandler balancer-manager

</Location>

ProxyPass /lbmanager !   #!表示状态页面不向后代理
ProxyPass / balancer://lb/ stickysession=JSESSIONID
ProxyPassReverse / balancer://lb/
<Location />
Order Allow,Deny
Allow from all
</Location>

<code>
[root@node1 conf.d]# service httpd restart  
</code>

然后在浏览其中访问,页面和上述的相同,都是两个页面。

修改配置文件实现会话绑定:

<code>
[root@node1 conf.d]# vim mod_proxy.conf  

ProxyPass / balancer://lb/  stickysession=JSESSIONID     #stickysession用于实现会话绑定

[root@node1 ~]# service httpd restart
</code>

然后刷新浏览器,页面不再变化。

查看负载均衡服务器的状态页面:

mod_jk status

提醒:

负载均衡,且实现会话绑定要注意给每个tomcat实例的egine容器一个jvmRoute属性!此名称要跟前端调度模块使用名称保持一致!
另外,在mod_proxy实现负载均衡的会话绑定时,还要使用sticksession=JSESSIONID(字符要大写)!


DevOps-田飞雨 》》转载请注明源地址
喜欢 (0)or分享 (0)
发表我的评论
取消评论
*

表情 贴图 加粗 链接 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址