1前言
本文讲述了如何在Windows和Linux下进行Apahce+Tomcat集群的安装配置。
Windows下Tomcat 集群的安装配置与Linux下稍有区别,本文分别进行了讲解。采用的例子为使用Apache作为集群的代理服务器,同时负责负载均衡,然后在两台机器上分别安装两一个Tomcat。如果在一台机器上安装多个Tomcat,需要对端口进行修改,以避免冲突。
Apache接受用户的请求,并根据一定规则将请求转发到两台Tomcat中的一台。Tomcat执行请求后,将结果返回给Apache ,Apache再将结果返回给用户。
2 准备工作
2.1 需要的软件
2.1.1 Apache2.2
本文采用的版本为Apache HTTP Server (httpd) 2.2.19 ,即目前最好用的版本。下载地址http://httpd.apache.org/download.cgi,请分别下载windows和linux版本。
使用Apache2.0或者更低版本时,需要单独安装mod_jk,且配置起来比较繁琐。本文采用的Apache2.2版本已经内置了安装集群所必须的模块,配置更简单。
2.1.2 Tomcat6
本文使用的Tomcat版本,Windows是apache-tomcat-6.0.18,linux是apache-tomcat-6.0.32。
2.2 准备机器
实际应用中,每个Tomcat实例一般部署在单独的机器上,且这些机器需要在同一网段。
本文中两台机器情况如下:第一台机器操作系统Windows,IP为192.168.106.57,安装一个Tomcat,第二台机器操作系统linux,IP为192.168.106.14,安装一个Tomcat和 Apahce。
为了实现session复制,需要注意以下两点:
1. 各tomcat实例需在同一网段下。
2. 所有的session attributes必须实例java.io.Serializable接口。
3 安装软件
3.1 Apache安装
3.1.1 Windows下安装
把Apache安装为运行在80端口的Windows服务,安装成功后在系统服务列表中可以看到Apache2.2服务。服务启动后在浏览器中输入http://localhost进行测试,如果能看到"It works!"的页面就代表Apache已经正常工作了。
3.1.2 Linux下安装
1. 解压文件:
文件 httpd-2.2.18.tar.gz放置在/home/tools/下,我们首先解压它。
[root@localhost ~]#cd /home/tools/
[root@localhost tools]#tar xzvf httpd-2.2.19.tar.gz
2. 配置安装文件:
安装文件我们想把 apache安装到/opt/apache2目录下,让apache启用DSO ,同时启用“proxy proxy_http proxy_ftp proxy_connect proxy_balancer headers”这六个模块。其中 headers不是集群必须的,但是对今后 apache 的应用有好处。
[root@localhost tools]#cd httpd-2.2.18
[root@localhost httpd-2.2.18]#./configure --prefix=/opt/apache2 --enable-so --enable-mods-shared="proxy proxy_http proxy_ftp proxy_connect proxy_balancer headers"
3. 编译安装:
[root@localhost httpd-2.2.18]#make
[root@localhost httpd-2.2.18]#make install
make命令读取配置文件进行编译,编译需要花费不短的时间。make install负责安装。
4. 测试一下:
通过命令启动:
Apache[root@localhost httpd-2.2.18]#cd /opt/apache2/bin
[root@localhost bin]#./apachectl -k start
在浏览器中输入http://192.168.106.41,如果能看到"It works!"的页面就代表Apache已经正常工作了。
停止命令:[root@localhost bin]#./apachectl -k stop
3.2 Tomcat安装
3.2.1 Windows安装
解压apache-tomcat-6.0.18.zip即可。
3.2.2 Linux安装
首先,将文件 apache-tomcat-6.0.32.tar.gz 拷贝到/opt下:
[root@localhost opt]#cp /home/tools/apache-tomcat-6.0.32.tar.gz /opt
解压:
[root@localhost opt]#tar xzvf apache-tomcat-6.0.32.tar.gz
4 配置过程
4.1 Apache配置
Apahce的配置包含两个方面:虚拟主机和集群配置。
4.1.1 虚拟主机
1. 在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
在linux环境中,此配置在Apache安装过程的第二步已经配置好。
2. 找到Include conf/extra/httpd-vhosts.conf,去掉前面的注释符
3. 打开conf/extra/httpd-vhosts.conf,配置虚拟站点,在最下面加上如下内容:
<VirtualHost *:80>
ServerAdmin 邮箱地址
ServerName 服务器名称
ServerAlias localhost
ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On
ProxyPassReverse / balancer://cluster/
ErrorLog "logs/clustertest-error.log"
CustomLog "logs/clustertest-access.log" common
</VirtualHost>
其中的的virtualHost*:80为HttpServer监听端口。
ServerAdmin:管理员邮箱
ServerName: 服务器名称
ServerAlias: 配置服务器域名或IP,如果有多个域名或者域名和IP同时使用,则使用空格隔开。
ProxyPass / balancer:// 是告诉Apache需要进行负载均衡的代理,后面的cluster是集群名,可以随意取,转发时带上session的名称。
ProxyPassReverse这行配置的含义是,使Apache调整HTTP重定向应答中Location, Content-Location, URI头里的URL。这样可以避免在Apache作为反向代理使用时,后端服务器的HTTP重定向造成的绕过反向代理的问题。
两个日志引擎日志名可以自己取
ErrorLog负责记录错误日志
CustomLog负责记录所有的http访问以及返回状态
4.1.2 集群配置在conf/httpd.conf文件最下面加上
ProxyRequests Off
<proxy balancer://cluster>
BalancerMember ajp://192.168.24.87:8009 loadfactor=1 route=jvm1
BalancerMember ajp://192.168.106.14:8009 loadfactor=1 route=jvm2
</proxy>
ProxyRequests: Off告诉Apache关闭正向代理,使用反向代理,用于配置工作在tomcat集群中的所有节点。
这里的"cluster"必须与上面的集群名保持一致。
BalancerMember: Apache通过ajp协议与tomcat进行通信,ip地址和端口唯一确定了tomcat节点和配置的ajp接受端口。loadfactor是负载因子,Apache会按负载因子的比例向后端tomcat节点转发请求,负载因子越大,对应的tomcat服务器就会处理越多的请求,如两个tomcat都是1,Apache就按1:1的比例转发,如果是2和1就按2:1的比例转发。route参数对应后续tomcat配置中的引擎路径(jvmRoute)。
重启Apache服务,如果此时访问http://localhost/将会返回503错误,打开刚才配置的错误日志logs/lbtest-error.log,可以看到错误原因是因为后台服务器没有响应,因为此时tomcat尚未配置和启动。
4.2 Tomcat配置修改每个Tomcat实例的配置文件。Tomcat/conf/server.xml
1. 配置Engine。Tomcat默认的Engine配置为
<Engine name="Catalina" defaultHost="localhost">
将其注释掉,并使用默认被注释的
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
这里jvmRoute="jvm1"对应前面Apache集群配置里的route=jvm1,这是192.168.106.57的Tomcat配置,192.168.106.14中的配置为:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm2">
2. 配置AJP Connector,这里是Apache和Tomcat链接的关键,前台的apache就是通过AJP协议与Tomcat进行通信的,以完成负载均衡作用。
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
port="8009"和在前面Apache里面配置的AJP端口一样。
3. 配置Cluster,默认Cluster配置被注释掉了,去掉注释:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" />
这里的配置可以在集群中的所有Tomcat节点间通过复制session共享会话(Session)。但是经过测试session复制不稳定,压力较大的情况下出现了session丢失的情况。其实以上是tomcat6的简化配置,它相当于以下配置的简写:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
其中的两个配置需要去掉:
1) 阀
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
2) Listener
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
以上两个配置是在使用mod_jk 并且没有用sticky sessions或者sticky sessions无法正常工作时的解决方案,我们没有用mod_jk,也就出了现压力较大时session复制失败的情况。因此,我们需要将上面的详细配置替换tomcat6中简化配置,并将上述两条配置去掉。
4. 注意,如果Tomcat在同一台机子上,需要修改Tomcat的启动端口、关闭端口、AJP Connector端口,以避免端口冲突。
4.3 Web工程配置在Web工程的web.xml里面加入<distributable/>,这样可以通知Tomcat服务器,当前应用需要在集群中的所有节点间实现Session共享。
5 注意1. 所有Tomcat实例必须在同一个网段。
2. 在同一台机子的Tomcat需要注意以下端口避免冲突。
a) Server port
b) Http的connector port
c) AJP的Connector port
d) Receiver的port
3. Session的attribute中的对象应实现java.io.Serializable接口,否则无法实现同步。
4. Linux中应打开组播功能
6 验证一下新建Web应用cluster-demo,在WBE-INF下新建web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<distributable/>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
新建index.jsp:
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>cluster测试</title>
</head>
<body>
<%
out.println("this is tomcat1");//在另一台机子上为”this is tomcat2”
String sessionid = session.getId();
out.println("sessionid = " + sessionid);
%>
</body>
</html>
在浏览器地址栏中输入http://localhost/cluster-demo,查看“tomcat1”和“tomcat2”是否按照1:1的比例切换,即是否实现了负载均衡,两个tomcat的sessionid是否一致。
7 参考资料
在写本文的时候,在参考了一下两个地方:
Tomcat关于集群文档http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html
Apache2.2中文文档http://ajava.org/online/apacheMenu2.2/index.html
同时,我上网查询了大量的文章博客,非常感谢你们提供的资料。
分享到:
相关推荐
总之,Apache+Tomcat集群和负载均衡的实现能够显著提升Web服务的可用性和性能,通过灵活选择负载均衡策略和模块,可以适应各种复杂的业务场景。在实际操作中,还需要不断调整和优化,以达到最佳的效果。
【Apache+Tomcat 集群与负载均衡及Session...通过以上配置,Apache+Tomcat集群可以实现高效的负载均衡和高可用性,同时通过Session绑定确保用户会话的连续性。注意定期监控和优化集群性能,以应对不断变化的业务需求。
### Apache+Tomcat集群与负载均衡配置详解 #### 一、环境说明 为了实现Apache与Tomcat集群的负载均衡,我们需要准备以下环境: 1. **服务器配置**:四台服务器,其中一台安装Apache,三台安装Tomcat。 - Apache...
在IT领域,特别是Web服务架构中,通过使用Tomcat、Apache和JK代理模块实现集群与负载均衡是一种常见的优化策略,旨在提升系统性能、稳定性和可用性。以下是对标题“tomcat+apache+jk集群和负载均衡”以及描述...
Apache+Tomcat+Linux集群和均衡负载(Session同步复制
### Apache+Tomcat+Linux集群和负载均衡 在IT领域,Apache+Tomcat+Linux集群与负载均衡技术是实现高可用性、高性能Web服务的重要手段之一。本文将围绕这一主题展开详细讨论,涵盖关键技术概念、配置流程及注意事项...
Apache+Tomcat+JK是一个常见的Web服务器和应用服务器集群解决方案,用于实现负载均衡和高可用性。这个配置中,Apache作为前端反向代理服务器,Tomcat作为后端的应用服务器,而JK模块是Apache与Tomcat之间的连接器,...
反向代理负载均衡 Apache + Tomcat集群 多的我也不多说了 看文档
Apache+Tomcat+JK 实现集群负载均衡是一种常见的Web服务器和应用服务器的部署方式,它能够提高系统的可用性和响应速度,实现服务的高并发处理。本文将详细介绍如何配置这一环境。 首先,我们需要准备以下软件: 1. ...
本文将详细介绍如何配置 Apache + Tomcat 集群,包括安装 Apache 和 Tomcat 服务器、配置 mod_jk 模块、配置 Apache 和 Tomcat 服务器、配置负载均衡控制器等。 一、安装 Apache 服务器 首先,需要安装 Apache ...
apache+tomcat集群的负载均衡和失败托管所需软件 包括 apache_2.0.55-win32-x86-no_ssl.msi apache-tomcat-7.0.40-windows-x86.zip mod_jk-apache-2.0.55.so
本主题聚焦于"Apache+Tomcat集群的负载均衡配置",通过Apache作为前端代理服务器,对后端的多个Tomcat实例进行负载分发,以实现高可用和高性能的服务。 首先,我们要理解负载均衡的基本概念。负载均衡是指将流入的...
Apache,Tomcat集群和负载均衡包括了apache-tomcat-5.5.29.zip,apache_2.2.4-win32-x86-no_ssl.msi,mod_jk-1.2.28-httpd-2.2.3.so,ApacheTomcat整合文档.doc,Apache,Tomcat集群和负载均衡教程.doc,Tomcat负载...
总结,实现Apache+Tomcat集群负载均衡的关键在于正确配置Apache的mod_proxy模块,以及确保Tomcat集群的会话一致性。通过这种方式,我们可以有效分摊高并发访问压力,提高系统的稳定性和响应速度。同时,持续监控和...
Apache+Tomcat集群的搭建和配置涉及多方面技术,包括网络、服务器管理、负载均衡原理、session管理等。这个过程需要对HTTP协议、Web服务器和应用服务器的内部工作原理有深入理解。实际操作时,还需要考虑安全性、...
Apache+Tomcat集群是一种常见的Web服务器和应用服务器集群架构,用于提高网站的可用性和可扩展性。Apache作为前端服务器,负责接收客户端的HTTP请求,并根据配置的负载均衡策略将这些请求转发给后端的多个Tomcat实例...