ApacheTomcat集群配置详解

Apache Tomcat集群配置详解一、软件准备Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi 安装程序,选择no ssl版本To

Apache Tomcat集群配置详解

一、软件准备

Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi 安装程序,选择no ssl版本

Tomcat 6.0 : http://tomcat.apache.org/download-60.cgi,下载Tomcat 6.0.18 zip文件

注意:由于Apache 和Tomcat 项目与集群相关的模块均处于持续发展和优化过程中,因此笔者不保证本文配置方法对所有Apache 和Tomcat 版本均适用。

二、软件安装

把Apache 安装为运行在80端口的Windows 服务,安装成功后在系统服务列表中可以看到Apache2.2服务。对于已安装IIS 的机器,在启动 Apache服务之前必须首先停止IIS Admin 服务,不然会因为端口冲突而无法启动。服务启动后在浏览器中输入

解压tomcat zip文件到两个文件夹,分别为t1和t2,以下均以t1和t2代表两个

tomcat 服务器。配置JAVA_HOME和CLASSPATH 系统环境变量,分别启动t1和t2,确保tomcat 可用,然后关闭tomcat 。

本文仅为讲解配置过程,Apache 和tomcat 均工作在同一台机器上。实际部署时没有任何限制,Apache 和单个tomcat 可以分别部署在不同的服务器上。

三、Apache 配置

Apache 2.2集成了mod_jk功能,相对于1.3版本,不需要再进行繁琐的

worker.properties 配置,配置过程大幅简化。

首先,在Apache 安装目录下找到conf/httpd.conf文件,以文本编辑器打开。

去掉以下文本前的注释符(#)以便让Apache 在启动时自动加载代理(proxy )模块。

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

LoadModule proxy_connect_module modules/mod_proxy_connect.so

,

LoadModule proxy_ftp_module modules/mod_proxy_ftp.so

LoadModule proxy_http_module modules/mod_proxy_http.so

向下拉动文档找到节点,在DirectoryIndex index.html后加上index.jsp ,这一步只是为了待会配置完tomcat 后能看到小猫首页,可以不做。

继续下拉文档找到Include conf/extra/httpd-vhosts.conf,去掉前面的注释符。

用文本编辑器打开conf/extra/httpd-vhosts.conf,配置虚拟站点,在最下面加上

ServerAdmin 管理员邮箱

ServerName 域名(没有可用IP 地址代替)

ServerAlias localhost

ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On

ProxyPassReverse / balancer://cluster/

ErrorLog "logs/lbtest-error.log"

CustomLog "logs/lbtest-access.log" common

这里balancer://是告诉Apache 需要进行负载均衡的代理,后面的cluster 是集群名,可以随意取,两个日志引擎ErrorLog 负责记 录错误,CustomLog 负责记录所有的http 访问以及返回状态,日志名可以自己取,笔者取为lbtest 。httpd-vhosts.conf 配置 完毕,回到httpd.conf ,在文档最下面加上

ProxyRequests Off

BalancerMember ajp://127.0.0.1:8009 loadfactor=1 route=jvm1

BalancerMember ajp://127.0.0.1:9009 loadfactor=1 route=jvm2

ProxyRequests Off 是告诉Apache 需要使用反向代理(利用Apache 进行负载均衡必须使用反向代理,关于更多负载均衡和反向代理详情可以参阅笔者另一篇博客

,

Apache 就按1:1的比例转发,如果是2和1就按2:1的比例转发。route 参数对应后续tomcat 配置中的引擎路径 (jvmRoute )。

打开 apache的配置文件httpd.conf ,找到这段代码: Options FollowSymLinks AllowOverride None Order deny,allow Deny from all

有时候由于配置了php 后,这里的“Deny from all”已经拒绝了一切连接。把该行改成“allow from all”,修改后的代码如下,问题解决。 Options FollowSymLinks AllowOverride None

Order deny,allow Allow from all

重启Apache 服务,如果此时访问http://localhost/将会返回503错误,打开刚才配置的错误日志logs/lbtest-error.log,可以看到错误原因是因为后台服务器没有响应,因为此时tomcat 尚未配置和启动。

四、Tomcat 配置

如果仅仅为了配置一个可用的集群,Tomcat 的配置将会非常简单。分别打开t1和t2的server.xml 配置文件,对于t1,尽量采用默认的设置,而对t2作较大改动以避免与t1冲突。如果t2和t1不在同一台服务器上运行,对于端口就不需做改动。

首先是配置关闭端口,找到,t1不变,把t2改为9005。

,

下面配置Connector 的端口,找到non-SSL HTTP/1.1 Connector,即tomcat 单独工作时的默认Connector ,保留t1默认配置,在8080端口侦听,而把t2设置为在9080端口侦听。

往下找到AJP 1.3 Connector,

redirectPort="8443" />,这是tomcat 接收从Apache 过来的ajp 连接请求时使用的端口,保留t1默认设置,把t2端口改为9009。注意,这里的端口对应 Apache httpd.conf中BalancerMember 中配置的ajp 连接端口。

继续向下配置引擎,找到,去掉这段或改为注释,把上方紧挨的注释符去掉,对于t2,去掉注释符并把jvm1改为jvm2。这里的jvmRoute 对应Apache httpd.conf中BalancerMember 中配置的route 参数。

向下找到,打开注释,这里的配置是 为了可以在集群中的所有tomcat 节点间共享会话(Session )。如果仅仅为了获得一个可用的tomcat 集群,Cluster 只需要这么配置就可 以了,对于更多的Cluster 配置笔者将另文解释。

server.xml的配置修改完毕,下一步需要对具体的应用进行配置。在webapps 目录下新建test 目录,在test 目录下新建test.jsp 文件,代码如下: <@ page contentType="text/html; charset=GBK" > <@ page import="java.util.*" > Cluster App Test Server Info: < out.println(request.getLocalAddr() " : " request.getLocalPort() "
");> < out.println("
ID " session.getId() "
"); String dataName = request.getParameter("dataName"); if (dataName != null && dataName.length() > 0) { String dataValue = request.getParameter("dataValue"); session.setAttribute(dataName, dataValue);

}

,

out.print("Session 列表"); Enumeration e = session.getAttributeNames(); while (e.hasMoreElements()) { String name = (String)e.nextElement(); String value = session.getAttribute(name).toString(); out.println( name " = " value "
"); System.out.println( name " = " value); } >

名称:

值:

在test 目录下继续新建WEB-INF 目录和web.xml ,在节点下加入

,这一步非常重要,是为了通知tomcat 服务器,当前应用需要在集群中的所有节点间实现Session 共享。如果tomcat 中的所有应用都 需要Session 共享,也可以把conf/context.xml中的改为,这样就不需对所有应用的web.xml 再进行单独配置。

启动t1,待t1启动完成后再启动t2。再次访问http://localhost,可以看到小猫页面。访问http://localhost/test/test.jsp。可以看到包括服务器地址,端口,sessionid 等信息在内的页面。

注意这里的sessionid ,与平常的sessionid 相比多了小数点和后面的部分,这里的jvm1即处理当前请求tomcat 服务器 的jvmRoute ,通过这里可以知道是集群中的哪一个服务器处理了当前请求。在文本框中输入名称和值,点击按钮,信息就保存到了Session 中,并且 显示到页面上。不断点击按钮,可以发现输入的信息并未丢失,而且sessionid 小数点之前的部分保持不变,而小数点后面的字符不停的变化,表明是由不 同的tomcat 服务器处理了这些请求。这样就实现了负载均衡,并且集群中的不同节点间可以实现会话的共享。

,

此时如果停止一个tomcat 服务器 t2,Apache 将会自动把后续请求转发到集群中的其他服务器即t1。重启t2后,Apache 会自动侦测到t2的状态为可用,然后会继续在t1和t2 间进行负载均衡。

如果需要向集群中增加节点,首先需要对tomcat 作类似配置,然后修改Apache httpd.conf ,增加BalancerMember ,指向新增的tomcat 即可。

标签: