Tomcat下的负载均衡

通常在建立网站的时候,稳定性是必须认真对待的事情。本文将介绍如何使用Tomcat的JK连接器实现网站的负载均衡以及会话共享。本文中使用的环境为Tomcat 7.0.2、Apache2.2、JK 1.2.28。

JK连接器是通过AJP协议与Tomcat服务器进行通讯的,Tomcat默认的AJP Connector的端口是8009。JK的配置最关键的有三个文件,分别是

  • httpd.conf:Apache服务器的配置文件,用来加载JK模块以及指定JK配置文件信息
  • workers.properties:到Tomcat服务器的连接定义文件
  • uriworkermap.properties:URI映射文件,用来指定哪些URL由Tomcat处理,你也可以直接在httpd.conf中配置这些URI,但是独立这些配置的好处是JK模块会定期更新该文件的内容,使得我们修改配置的时候无需重新启动Apache服务器。 

这里需要注意,由于Apache 2.2已经集成了JK模块,相对于早期版本,这里已经不需要再进行繁琐的worker.properties配置了。

本文的试验场景为:

  • 两台机器上装有Tomcat:tomcat1(192.168.23.135),tomcat2(192.168.23.221);
  • Apache安装在192.168.23.135;
  • 两个Tomcat平分负载。

在Apache和Tomcat环境搭建好之后,就可以开始如下的配置了。

在Apache-dir/conf/httpd.conf文件中作如下修改:

  • 允许Apache启动时自动加载代理(proxy)模块,即:将形如“LoadModule proxy_* modules/mod_proxy*”之前的注释符去掉;
  • 使用虚拟主机文件,即:将“Include conf/extra/httpd-vhosts.conf”前面的注释符去掉;
  • 使用反响代理以及设置集群,添加如下代码:
    view source
    print ?
    01 #告诉Apache需要使用反向代理
    02  ProxyRequests Off 
    03   
    04 #用于配置工作在tomcat集群中的所有节点,这里的"clustename"为集群名,可以任意取
    05 <proxy balancer://clustename>
    06   
    07     #loadfactor是负载因子,Apache会按负载因子的比例向后端tomcat节点转发请求
    08     #route参数对应后续tomcat配置中的引擎路径(jvmRoute)
    09     BalancerMember ajp://192.168.23.135:8009 loadfactor=1 route=tomcat1
    10   
    11     # 如果第二个Tomcat放在另一台电脑上那么就输入那台电脑的ip和tomcat的端口号
    12     BalancerMember ajp://192.168.23.221:12009 loadfactor=1 route=tomcat2
    13 </proxy>

接下来,在Apache-dir/conf/extra/httpd-vhosts.conf文件中配置虚拟站点,在文件末尾中添加:

view source
print ?
1 <VirtualHost *:80>
2          ServerAdmin ***@gmail.com
3          ServerName 192.168.23.135  #或者主机名
4          ServerAlias   servername
5          ProxyPass / balancer://clustename/ stickysession=jsessionid nofailover=On
6          ProxyPassReverse / balancer://clustename/
7          ErrorLog "logs/thc-error.log"
8          CustomLog "logs/thc-access.log" common
9 </VirtualHost>

其中balancer://是告诉Apache需要进行负载均衡的代理,后面的clustename是集群名,需要跟httpd.conf文件中的clustename保持一致。

Apache已经准备好了,下面要进行Tomcat的配置。这里主要是修改Tomcat-dir/conf目录下的server.xml文件。分别对tomcat1、tomcat2的server.xml文件进行如下更改:

  • 为Catalina引擎设置唯一的jvmRoute,这里需要跟httpd.conf中BalancerMember设置的rout保持一致,即:
    view source
    print ?
    1 <Engine name="Catalina" defaultHost="localhost">
    2 #变更为
    3 <Engine jvmRoute="tomcat1" name="Standalone" defaultHost="localhost" debug="0">
  • 将如下代码的注释去掉:
    view source
    print ?
    1 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

下面就是最后一步了,为了模拟出负载均衡的效果,我们在两个tomcat的/webapps/ROOT目录下分别创建一个index.jsp。

启动Apache、tomcat1、tomcat2,就可以开始实验了。在浏览器中输入http://192.168.23.135/index.jsp,则可以看到看到包括服务器地址,端口,sessionid等信息在内的页面。在文本框中输入Name和Value,点击提交,信息就保存到了Session中,并且显示到页面上。不断刷新页面,会发现Session信息不变,但是服务器地址却变了。这样负载均衡和会话共享就实现了!

关于更多集群内容,请参见本站的集群Grails应用、使用EhCache集群Grails的Hibernate二级缓存、Tomcat中的Grails应用集群。

你可能感兴趣的:(Tomcat下的负载均衡)