前面已经说明了如何使用mod_jk和mod_proxy模块连接Tomcat。没有看的请点击 使用apache和nginx连接tomcat。下面将介绍基于apache的mod_jk模块和mod_proxy模块实现tomcat负载均衡。
<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>
然后再浏览器中访问,刷新会出现两个不同的页面如下所示:
如果出现以下页面则说明Apache与tomcat没有连接成功,Apache配置文件有问题:
修改配置文件,启用会话保持功能:
<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页面,如下所示:
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>
然后刷新浏览器,页面不再变化。
查看负载均衡服务器的状态页面:
提醒:
负载均衡,且实现会话绑定要注意给每个tomcat实例的egine容器一个jvmRoute属性!此名称要跟前端调度模块使用名称保持一致!
另外,在mod_proxy实现负载均衡的会话绑定时,还要使用sticksession=JSESSIONID(字符要大写)!