2013-11-18 16:16:01
来 源
ITJS.CN
Apache
本文介绍部署Apachetomcat负债均衡集群,希望对于初学Apache服务器相关的朋友有帮助,更多Apache安装、配置、报错处理等资源请本站内搜索。

此文档内容已经经过测试

JavaSDK版本: 1.6.20

Apache版本: 2.2.15    http://httpd.apache.org/

Tomcat版本: apache-tomcat-6.0.35 http://tomcat.apache.org/download-60.cgi

====================================

安装

javaSDK就默认安装了.

apache的安装没有什么特别的,一路下一步即可,当然,最好修改apache的默认安装目录.

安装时注意,80端口不要被占用了.

tomcat的安装需要考虑下,是采用解压版本的tomcat,还是安装版本的tomcat.

我们这里采用解压版的tomcat

因为需要做tomcat的负载均衡,因此肯定需要解压2个以上的tomcat.我们这里用两个tomcat.

解压到某一个目录中后,需要修改tomcat目录中bin目录下的catalina.bat文件和catalina.bat文件,在文件首部加入:

set JDK_DIR=C:Program FilesJavajdk1.6.0_20

set JAVA_HOME=%JDK_DIR%

set tomcatStart="d:tomcat1bin"

这样运行每个tomcat时,就不会因java和tomcat路径混乱导致出错了.

配置

一、配置apache

修改apache的配置文件httpd.conf

1. 启用moddle

将以下Module的注释去掉,这里并没有使用mod_jk.so进行apache和tomcat的链接,从2.X以后apache自身已集成了mod_jk.so的功能

。只需简单的把下面几行去掉注释,就相当于以前用mod_jk.so比较繁琐的配置了。这里主要采用了代理的方法,就这么简单。

LoadModule proxy_module modules/mod_proxy.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

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

注: 我启用了三个就OK了  mod_proxy.so  /  mod_proxy_ajp.so   /  mod_proxy_balancer.so

2. 添加页面

再找到<IfModule dir_module></IfModule>加上index.jsp修改成

<IfModule dir_module>

DirectoryIndex index.html index.jsp

</IfModule>

3、在httpd.conf同级目录新建mod_jk.conf

内容

#加载mod_jk Module    

LoadModule jk_module modules/mod_jk-1.2.26-httpd-2.2.4.so

#指定 workers.properties文件路径    

JkWorkersFile conf/workers.properties         

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

JkMount /*.jsp controller

JkMount /*.do controller

JkMount /*.action controller

然后在httpd.conf文件最下方加入:include conf/mod_jk.conf  

文件workers.properties    内容

worker.list = controller  #server 列表 

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

worker.tomcat1.port=8009         #ajp13 端口号,在tomcat下server.xml配置,默认8009 

worker.tomcat1.host=localhost  #tomcat的主机地址,如不为本机,请填写ip地址 

worker.tomcat1.type=ajp13 

worker.tomcat1.lbfactor = 1   #server的加权比重,值越高,分得的请求越多 

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

worker.tomcat2.port=8010       #ajp13 端口号,在tomcat下server.xml配置,默认8009 

worker.tomcat2.host=localhost  #tomcat的主机地址,如不为本机,请填写ip地址 

worker.tomcat2.type=ajp13 

worker.tomcat2.lbfactor = 1   #server的加权比重,值越高,分得的请求越多 

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

worker.controller.type=lb 

worker.controller.balanced_workers=tomcat1,tomcat2 #指定分担请求的tomcat 

worker.controller.sticky_session=1 

<!-- 还有一种是这样

然后加入BalancerMember成员(与tomcat关联)

在httpd.conf文件最下方加入:

ProxyRequests Off

<proxy balancer://cluster>

BalancerMember ajp://127.0.0.1:8009 loadfactor=1 route=jvm1(此处名称与对应tomcat中<Engine jvmRoute="jvm1">一致)

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

</proxy>

这里的IP跟端口就是跟tomcat中的配置一样即可.如果在同一台计算机上,就如上配置,如果不在同一台计算机上,就要修改IP.

上面的两个BalancerMember成员就是我们配置的tomcat集群.

-->

4. 虚拟主机设置  (这一步还没做)

接下来进行虚拟主机的设置。APACHE的虚拟主机设置如下:

首先要修改 conf/httpd.conf找到(#Include conf/extra/httpd-vhosts.conf) , 把注释去掉。

# Virtual hosts

Include conf/extra/httpd-vhosts.conf

在下面加入

<VirtualHost *:80>

ServerAdmin [email protected]

ServerName localhost

ServerAlias localhost

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

ProxyPassReverse / balancer://cluster/

</VirtualHost>

其中的域名和路径根据你自己情况设置

然后再设置TOMCAT虚拟主机

二、tomcat配置

修改tomcat1的配置文件 server.xml

1. 修改SHUTDOWN端口(tomcat的关闭端口)

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

tomcat2:<Server port="8006" shutdown="SHUTDOWN">

2. 修改运行端口

因为tomcat有两个,因此只需要修改其中某一个tomcat运行的端口即可:

tomcat1:

<Connector port="8080" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443" />

tomcat2:

<Connector port="8081" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443" />

注:只需要修改port参数,不用修改redirectPort参数

3. 修改connector的端口

tomcat1:<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

tomcat2:<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />

注:只需要修改port参数,不用修改redirectPort参数

4. 启用配置 Engine

为了通过AJP来支持负载均衡,需要配置engine的jvmRoute属性.

server.xml文件中, 修改Engine 段, 增加jvmRoute参数,如下:

tomcat1:<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

tomcat2:<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">

5. 配置Cluster

server.xml文件中,原来的配置 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> 应该是被注释的,现在

用下面的配置代替:(tomcat文档中推荐的).这个设置是主要用以tomcat的集群.

关键在于 Receiver 段中的port参数,tomcat之间必须不同:

tomcat1:

<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>

tomcat2:

<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"  -----每个tomcat此项必须配置一致,否则session将不能完成同步,address相同的就是互相广播复制session的。

port="45564"

frequency="500"

dropTime="3000"/>

<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

address="auto"

port="4001"

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>

三、启动服务,测试tomcat自带的例子

1、测试apache和tomcat协作。

先在每个tomcat中的webappsROOT下的index.jsp下面加上以下的测试代码部分:(X代表不同的tomcat的输出不同的信息),把

index.html删除,以免影响测试效果。在最后面的加上.即</table></body>之间。

<%

System.out.println("hello,world!");

%>

然后再通过http://127.0.0.1/来访问一下,就会出现大家熟悉的猫猫。

然后再通过分别访问

http://127.0.0.1:8080/, http://127.0.0.1:8081/ , 它们访问的内容和上面的http://127.0.0.1/是一样的。

这样就说明apache和TOMCAT整合成功!

2、测试均衡器

通过http:// 127.0.0.1多次访问,要想看到真正的效果,必须用一些压力测试工具,可用微软Microsoft Web Application Stress

Tool进行简单压力测试,不然你靠不停刷新是体现不出来的,你只会在一个tomcat的控制台有输出结果。只用用压力测试工具模拟

大量用户同时访问,你会发现四个tomcat控制台均有打出控制信息,说明均衡器工作正常。

四、问题处理

若启动时出现这样的错误提示:

2010-06-28 15:04:51 org.apache.catalina.ha.deploy.FarmWarDeployer start

严重: FarmWarDeployer can only work as host cluster subelement! 

则将以下部分注释掉: (一般情况都会遇到的)

<!--

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

  tempDir="/tmp/war-temp/"   

  deployDir="/tmp/war-deploy/"   

  watchDir="/tmp/war-listen/"   

  watchEnabled="false"/>   

-->

以上内容参考了诸多文档,终于自己测试OK并部署成功了.

http://127.0.0.1/test.jsp

打开多个窗口 分别访问上面地址。。确保请求的不是一个tomcat

都输入 输入名称,值, 

如:tomcat1 输入tomcat1,tomcat1  

tomcat2 输入tomcat2,tomcat2

提交后session列表会显示当前session中保持的值,  这时可以停止tomcat1服务(此时tomcat1服务已停止,),再刷新访问

tomcat1的浏览器,在输入新值提交,如原来tomcat1还存在说明session同步成功,(因为此时tomcat1已停止,请求的是tomcat2服

务,tomcat1中session已成功复制到tomcat2服务中)

在做session同步的时候,需要注意一点的是:

1、 保存至session中的对象一定要是可进行序列化的(实现Serializable接口),俺在

这个问题上折腾了会,其实想想也不难,session同步就是将对象/值在网络中传输的一个过程,apache,tomcat底层做session同步

也不过这样做,所以对象的话必须是可序列化的。

2、当然还有一种方法,在你的项目不要经过分布试部署的时候比较简单:去掉web.xml中的 <distributable/> 。这种不太赞成,因为这样设置session将不能同步,session不能同步会导致可不是个理想的状态,你说呢、、、

ok !!  完成!

其它相关资料:

http://hi.baidu.com/luodaijun/blog/item/5bbe4cfb5ffef864034f56a1.html

Nginx

nginx 相对 apache 的优点:

轻量级,同样起web 服务,比apache 占用更少的内存及资源

抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能

高度模块化的设计,编写模块相对简单

社区活跃,各种高性能模块出品迅速啊

apache 相对nginx 的优点:

rewrite ,比nginx 的rewrite 强大

模块超多,基本想到的都可以找到

少bug ,nginx 的bug 相对较多

超稳定

nginx的upstream目前支持4种方式的分配

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、weight

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

2、ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

3、fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

4、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。