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
向下拉动文档找到
继续下拉文档找到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 ,找到这段代码:
有时候由于配置了php 后,这里的“Deny from all”已经拒绝了一切连接。把该行改成“allow from all”,修改后的代码如下,问题解决。
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不在同一台服务器上运行,对于端口就不需做改动。
首先是配置关闭端口,找到
下面配置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 连接端口。 继续向下配置引擎,找到 向下找到 server.xml的配置修改完毕,下一步需要对具体的应用进行配置。在webapps 目录下新建test 目录,在test 目录下新建test.jsp 文件,代码如下: <@ page contentType="text/html; charset=GBK" > <@ page import="java.util.*" >
");> < 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 ,在
启动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 即可。