huangdos
作者huangdos·2010-11-18 10:49
CTO·深圳乐凯撒股份有限公司

开源的apache 集群

字数 13656阅读 6002评论 1赞 2

apache http server + tomcat 的这种集群和集成模式在客户经费有限的情况下,还是非常好的一个选择,毕竟不是什么项目都能用其 WAS 这类产品的。 :) 

虽然网上也有不少资料,但是对于刚接触 apache 集群这块的用户,还是会比较头大,这里我就个人的实际项目经验和应用,来介绍两种常见的应用场景。

一种是 多个不同应用,不同的开发团队要作为一个整体给用户访问,就需要集成到一起显示, 另外则是为了提高稳定性和性能,将相同的应用要做集群部署这2种模式。 当然具体使用中也可以两种结合。 

一、准备相关软件

下载安装Apache http ,官方网站上就能下载:

http://httpd.apache.org/

1.安装:

apache_2.2.11-win32-x86-no_ssl.msi

1.1接受安装协议 1.2配置apache服务器信息

Network Domain设置站点名称,这个不会对实际站点产生影响。
Server Name
设置当前服务器名称,这个不会对实际站点产生影响。
Administrator’s Email Address
设置站点管理员邮件地址,Apache文档说明当站点出错时的页面底部会出现该地址。

1.3安装类型一般选择typical 1.4 安装路径选择,例如E:Apache2.2

 

2. 安装tomcat

下载tomcat :(地址: http://tomcat.apache.org/index.html

例如文件为: apache-tomcat-5.5.26.zip

 

一切准备就绪后,就开始下面几介绍如何使用开源免费的产品来实现集成和集群的服务吧。

二、单台主机多站点场景:

在一台机器上配置多个站点,每个站点有自己独立的域名。假设服务器有两个站点root.abc.combbs.abc.com,两个站点分别运行在一个tomcat下。为方便说明,下面分别简称为rootbbs站点。

相关配置文件样例可以参考安装目录下面的:“参考配置 ” 下面的相关配置文件。

1.      Apache配置

Tomcat Connector文件mod_jk-1.2.28-httpd-2.2.3.so拷贝到Apache安装目录Apache2.2modules下。
Apache配置文件Apache2.2confhttpd.conf末尾增加以下内容;

 

#以下为tomcat集成配置部分

LoadModule jk_module modules/mod_jk-1.2.28-httpd-2.2.3.so 

JkWorkersFile conf/workers.properties 

 

#如果机器有多个IP地址请务必使用* 

NameVirtualHost *:80 

 

#bbs.abc.com虚拟站点 

<VirtualHost *:80>

ServerName bbs.abc.com

#设置静态文件通过apache的处理目录

DocumentRoot F:/tomcat551/webapps

JkMount /*.* tomcatbbs

DirectoryIndex index.jsp

</VirtualHost>

 

#root.abc.com虚拟站点

<VirtualHost *:80>

ServerName root.abc.com

DocumentRoot F:/tomcat552/webapps/ROOT

JkMount /*.* tomcatroot

DirectoryIndex index.jsp

</VirtualHost>

配置完成以后使用开始程序菜单目录中的Apache HTTP Server 2.2.4? Configure Apache Server? Test Configuration检查Apache配置文件是否正确。

再找到Windows的系统文件:Host节点配置更改一些内容,将这里的域名映射写进去: C:WINDOWSsystem32driversetc hosts

在其中最后加上:

127.0.0.1 bbs.abc.com

127.0.0.1 root.abc.com

2.      Tomcat Connector配置

Apache配置目录Apache2.2conf创建workers.properties配置文件,该文件主要用于配置ApacheTomcat的集成要用到的Tomcat实例。
workers.properties
文件放置一下内容;

 

#下面是Tomcat实例列表

worker.list=tomcatbbs,tomcatroot

 

#Tomcatbbs实例配置

worker.tomcatbbs.host=127.0.0.1

worker.tomcatbbs.port=8009

worker.tomcatbbs.type=ajp13

 

#Tomcatroot实例配置

worker.tomcatroot.host=127.0.0.1

worker.tomcatroot.port=9009

worker.tomcatroot.type=ajp13

 

3.      Tomcat配置

rootbbs分别运行在两个Tomcat实例下,将刚才下载的Tomcat分别解压为两个目录tomcatbbstomcatroot

 

3.1.   Tomcatbbs实例配置

打开bbs站点tomcat目录下的confserver.xml,找到下面的节点内容

 

<Server port="8005" shutdown="SHUTDOWN">

<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->

<Connector port="8080" maxHttpHeaderSize="8192"

 maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

 enableLookups="false" redirectPort="8443" acceptCount="100"

 connectionTimeout="20000" disableUploadTimeout="true" />

 

中间忽略N多注释

 

<!-- Define an AJP 1.3 Connector on port 8009 -->

<Connector port="8009"enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

注意以上标注红色的配置,同一台机器的多个Tomcat不能重复使用以上端口,下半部分AJP的端口配置要和workers.properties的端口配置保持一致。

 

在找到Host节点配置更改一些内容

<!-- Define the default virtual host

Note: XML Schema validation will not work with Xerces 2.2.

-->

<Host name="bbs.abc.com" appBase="webapps"

unpackWARs="true" autoDeploy="true"

xmlValidation="false" xmlNamespaceAware="false">

以上第一处是配置站点域名和站点内容路径,下面增加的内容是配置站点的根路径。

 

3.2.   Tomcatroot实例配置

打开root站点tomcat目录下的confserver.xml,找到下面的节点内容

 

<Server port="9005" shutdown="SHUTDOWN">

<!-- Define a non-SSL HTTP/1.1 Connector on port 9090 -->

<Connector port="9090" maxHttpHeaderSize="8192"

maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

enableLookups="false" redirectPort="8443" acceptCount="100"

connectionTimeout="20000" disableUploadTimeout="true" />

 

中间忽略N多注释

 

<!-- Define an AJP 1.3 Connector on port 8009 -->

<Connector port="9009"

 enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

 

以上标注红色的配置,同一台机器的多个Tomcat不能重复使用以上端口,下半部分AJP的端口配置要和workers.properties的端口配置保持一致。请注意本次配置分别改了两个端口为90909009

 

在找到Host节点配置更改一些内容

 

<!-- Define the default virtual host

Note: XML Schema validation will not work with Xerces 2.2.

-->

<Host name="localhost" appBase="webapps"

unpackWARs="true" autoDeploy="true"

xmlValidation="false" xmlNamespaceAware="false">

<!--如果该站点有多个域名的服务,那么只要类似如下的别名就行 -->

<Alias> root.abc.com </Alias>

<Alias>sp.shixing.gov.cn</Alias>

<Alias>jc.shixing.gov.cn</Alias>

<Alias>sys.shixing.gov.cn</Alias>

 

以上是配置站点域名和站点内容路径。

4.      全部配置完毕之后,注册服务和启动服务

首先tomcat 绿色版本的环境需要注册成为服务才能自动启动。

通过cmd 命令,分别到解压的tomcat 安装目录下面的 bin 目录下:

例如:

E:tomcatbbsbin

在该目录下运行: service.bat install tamcatbbs

就能将当前tomcat 注册成为Windows的系统服务。

然后再到“服务”功能中将该服务设置为自动启动。

 

注册成功后如下图所示:

分别启动 apache tomcatbbs,tomcatroot 服务,打开浏览器,输入相应域名就能访问了。

 

 

5.      常见问题

修改host文件,加入root.abc.combbs.abc.com解析至当前机器127.0.0.1
分别启动Apache和两个Tomcat,打开两个浏览器分别输入root.abc.combbs.abc.com测试是否显示不同的站点内容。

如果没有达到预期效果请检查一下几点配置:
Apache2.2confhttpd.conf
配置文件是否配置的两个Host是否配置了域名
Host
JkMount /*.* tomcatroot配置tomcat对应的Service.xml中配置的域名是否一致
Worker.properites
中配置的tomcat实例端口是否和对应tomcat Service.xml文件中的AJP端口是否一致
Tomcat Service.xml
配置文件Host节点是否有<Context docBase="." path="" reloadable="true"/>配置内容
Tomcat
站点内容目录下是否有httpd.conf文件Host节点中DirectoryIndex index.jsp配置的文件

 

 

三、单台主机单站点(单应用)集群、负载均衡场景:

1.      Apache配置

Tomcat Connector文件mod_jk-1.2.26-httpd-2.2.4.so拷贝到Apache安装目录Apache2.2modules下。
Apache安装目录找到conf/httpd.conf文件,在末尾增加一下内容

 

#以下为tomcat 集群配置

LoadModule jk_module modules/mod_jk-1.2.28-httpd-2.2.3.so

JkWorkersFile conf/workers.properties  

 

#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器

JkMount /*.jsp controller

JkMount /*.action controller

 

 

2.      Tomcat Connector配置

Apache配置目录Apache2.2conf创建workers.properties配置文件,该文件主要用于配置ApacheTomcat的集成要用到的Tomcat实例和负载均衡分发控制器。
Workers.properties
文件放置以下内容

 

 

#server 列表

worker.list = controller,tomcat1,tomcat2

#========tomcat1========

#Tomcat1实例配置 这里要和Tomcat配置文件Service.xmljvmRoute保持一致

#ajp13 端口号,在tomcatserver.xml配置,默认8009

worker.tomcat1.port=8009        

#tomcat的主机地址,如不为本机,请填写ip地址或域名

worker.tomcat1.host=localhost 

worker.tomcat1.type=ajp13

#server的加权比重,值越高,分得的请求越多

worker.tomcat1.lbfactor = 1

### Define preferred failover node for tomcat2 ,如果开启下面的这个属性表示,tomcat1崩溃之后,所有请求转向tomcat2

#worker.tomcat1.redirect= tomcat2

 

 

#========tomcat2========

#ajp13 端口号,在tomcatserver.xml配置,默认8009

worker.tomcat2.port=9009

#tomcat的主机地址,如不为本机,请填写ip地址或域名

worker.tomcat2.host=localhost  

worker.tomcat2.type=ajp13

#server的加权比重,值越高,分得的请求越多

worker.tomcat2.lbfactor = 1  

###Disable tomcat2 for all requests except failover 如果开启下面的这个属性表示,所有的请求都为tomcat1处理,直到它崩溃。

## 开启上下2个设置表示 tomcat2 tomcat1 的备份应用服务

#worker.tomcat2.activation=disabled

 

#========controller,负载均衡控制器========

worker.controller.type=lb

#指定分担请求的tomcat

worker.controller.balanced_workers=tomcat1,tomcat2

 

3.      Tomcat配置

Tomcat配置文件Service.xml主要注意两个地方,一个是Engine节点需要增加节点标识jvmRoute,一个是将原本注释掉的Session复制节点改为有效。即将<Cluster>的注释取消。具体如下

 

 

    <!-- You should set jvmRoute to support load-balancing via AJP ie :   -->

    <Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat2">

   

      

    <!-- Define the top level container in our container hierarchy

        <Engine name="Catalina" defaultHost="localhost">

-->

<!—中间略过部分代码 -->

        <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"

                 managerClassName="org.apache.catalina.cluster.session.DeltaManager"

                 expireSessionsOnShutdown="false"

                 useDirtyFlag="true"

                 notifyListenersOnReplication="true">

 

            <Membership

                className="org.apache.catalina.cluster.mcast.McastService"

                mcastAddr="228.0.0.4"

                mcastPort="45564"

                mcastFrequency="500"

                mcastDropTime="3000"/>

            <Receiver

className="org.apache.catalina.cluster.tcp.ReplicationListener"

                tcpListenAddress="auto"

                tcpListenPort="4002"

                tcpSelectorTimeout="100"

                tcpThreadCount="6"/>

 

            <Sender

className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"

                replicationMode="pooled"

                ackTimeout="15000"/>

 

            <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"

filter=".*.gif;.*.js;.*.jpg;.*.png;.*.htm;.*.html;.*.css;.*.txt;"/>

                   

            <Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"

                      tempDir="/tmp/war-temp/"

                      deployDir="/tmp/war-deploy/"

                      watchDir="/tmp/war-listen/"

                      watchEnabled="false"/>

            <ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/>

        </Cluster>

 

我们分别将两个Tomcat配置文件中的jvmRoute设置为tomcat1tomcat2Server节点 端口分别配置为80059005,集群Receiver 节点tcpListenPort端口分别配置为40014002Connector节点端口分别配置为80809090AJPConnector端口分别配置为80099009Connector端口配置参照单主机多站点场景。请注意两个Tomcat配置文件Host节点的域名配置必须一样,Server.xml中的jvmRoute名称必须和worker.properties中的tomcat实例名称一致,不然无法实现session_stricky。其中高亮的地方是需要注意的地方。

 

4.      Web.xml配置

将部署在tomcat 目录下的应用中的Web.xml配置文件加上<distributable/>节点,此配置说明当前Web工程处于分布式部署环境。如果不进行这个配置,每次访问页面tomcat都会产生一个新的sessionid

四、常见问题

修改Host文件将bbs.abc.com解析到本机。打开两个IE窗口分别提交session操作,然后在控制台观察效果。
正常情况为;同一个IE窗口的所有请求都分发到同一个Tomcat,当关闭其中一个Tomcat时,IE窗口重新请求会分发到另一个Tomat并且Session保持同步。

 

如果没有达到预期效果请检查一下几点;
Apache
配置文件中DirectoryIndex配置的文件是否存在tomcat应用的目录下
Apache
配置文件中JkMount是否分发到负责均衡控制器
两个Tomcat端口是否有重复,
Worker.properties
tomcat端口是否和对应server.xmlAJPConnector端口一致

Server.xml
配置文件的Host节点name属性是否一致
Server.xml
配置文件的Engine节点是否配置jvnRoute,并且与worker.properties配置的名称保持一致
Server.xmlHost
节点内的Cluster节点是否设置为有效

1.      乱码问题:

 修改Tomcat server.xml 配置文件,例如按如下修改对应tomcat的配置:

 

    <!-- Define an AJP 1.3 Connector on port 8009 -->

    <Connector port="9009" URIEncoding="GBK"

               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

 

因为使用了Apache进行转发,所以tomcat 接受请求的端口变成worker.properties里面配置的端口了。从而需要在tomcat的对应这个端口中设置字符集编码。

 

2.      图片不显示和连接失效等问题:

如果应用中使用了 Jfreechart 之类的开源组件,能够自动生成图片。这些图片在tomcat下面可以看到,但是加到apache之后就显示不出来了。这种原因一般是由于apache那边的URL转向配置有一定的遗漏。 常用的解决方法:在配置中将所需解析路径都加上

 

<VirtualHost *:80> 

ServerName 127.0.0.1

JkMount /*.* tomcatroot

JkMount /* tomcatroot   

DirectoryIndex index.jsp  

</VirtualHost> 

 

 

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论1 条评论

huangdoshuangdosCTO深圳乐凯撒股份有限公司
2010-11-18 10:55
不知道为什么字体有点变形
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广