??xml version="1.0" encoding="utf-8" standalone="yes"?>
然后调整里边JavaMs?span lang="EN-US">JavaMx的|前者表C行时加蝲的最内存,后者表C可利用的最大内存,单位?span lang="EN-US">MQ要换到十进制下L。这个问题搞了三个周才找到解军_法,W一ơ就败在此处Q?span lang="EN-US">
W二ơ什么错误是其中一台机器上tomcat启动报错Unable to start cluster. org.apache.catalina.tribes.ChannelException: java.net.SocketException: error set ting options; No faulty members identified. Q搞了一天没有找到解军_法,弃之Q那位仁兄如果有解决办法Ƣ迎赐教Q?span lang="EN-US">
W三ơ集方式和前两ơ没什么区别,都是采用http_proxy形式作ؓApache?span lang="EN-US">tomcat之间q接的桥梁,q次把成功的配置详细的说明下Q?span lang="EN-US">
1.Lapache?span lang="EN-US">httpd.conf目录中以下几行的注释
#change here start
#end |
# Virtual hosts
# change here two step
是L了注释,主要用于配置虚拟机文?span lang="EN-US"> |
2.
?span lang="EN-US">httpd.conf最下边加上q些东东
ProxyRequests Off
<proxy balancer://cluster>
BalancerMember ajp://192.168.0.22:9001 loadfactor=1 route=jvm3
BalancerMember ajp://192.168.0.22:9003 loadfactor=1 route=jvm4
BalancerMember ajp://192.168.0.22:9090 loadfactor=1 route=jvm5
</proxy>
ProxyRequests Off
<proxy balancer://cluster2>
BalancerMember ajp://192.168.0.1:8009 loadfactor=1 route=jvm1
</proxy>
ProxyRequests Off
<proxy balancer://cluster3>
BalancerMember ajp://192.168.0.1:9009 loadfactor=1 route=jvm2
</proxy> |
具体什么意思就不说了,W一行表格是做集用Q下边两个仅作ؓ负蝲均衡之用Q可以说没均衡负蝲Qؓ啥?׃?span lang="EN-US">tomcat你做什么负载啊Q呵c重点关注这?/span>
<proxy balancer://cluster2> |
Cluster2 才是关键所在,他表CZ你的站点要在那个集内做负蝲均衡或者集,我们q里用到了集和负蝲均衡Q其实就是一回事说白了,?/span> cluster 做集, cluster2 ?/span> cluster3 仅做负蝲均衡之用Q不?/span> session 复制和绘M持?/span>
2 下边我们看下 extra 目录?/span> httpd-vhosts.conf 文g的修改吧
以上边说?/span> cluster,cluster2,cluster3 Z各配|一个虚拟机
<VirtualHost *:80> ServerAdmin cxccma@163.com ServerName *****.com ServerAlias www.*****.com ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On ProxyPassReverse / balancer://cluster/ </VirtualHost> |
<VirtualHost *:80> ServerAdmin cxccma@163.com ServerName *****.cn ServerAlias www. *****.cn ProxyPass / balancer://cluster2/ ProxyPassReverse / balancer://cluster2/ </VirtualHost> |
<VirtualHost *:80> ServerAdmin cxccma@163.com ServerName *****.com ServerAlias www. *****.com ProxyPass / balancer://cluster3/ ProxyPassReverse / balancer://cluster3/ </VirtualHost> |
以上明白了,是说是三个站点分别在不同的集内,Z么要q样做?主要是因为我们前期用的是 tomcat5.5 版本的,后期开发中友用C 6.x 版本的,所以整了两个群集以兼容前期和后期的站点Q当然如果你需要在 cluster2, 或?/span> cluster3 中再加一?/span> tomcat 做负载均衡用 ,OK, 很简单,直接复制下就可以
3.apache 说完了,接下来说?/span> tomcat ?/span>
Tomcat 中不用做什么大的改动,首先?/span> server.xml 文g中部|你的虚拟主机啊
<Host name="www.******.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="D:\lejie" debug= "0" reloadable="false" crossContext="false" verbosity="DEBUG"> </Context> </Host> |
OK Q如果需要做全局集群Q那׃?/span> content.xml 文g?/span> Context 元素Q加上这句就?/span>
distributable="true" |
或者在单独的文件中?/span> web.xml 文g中加入这句话
< distributable/> |
到这应该都说完了吧,谈下个h的想法: apache ?/span> tomcat 有三U连接方法: JK Q?/span> mod_proxy,http_proxy Q前两者的配置都是繁琐,在可l护性和模块化上也没什么优点,我一直用W三U连接方法,采用 AJP 直连Q?/span> AJP1.3 在连接上表现出明昄优点Q所以我也徏议采用第三种q接?/span>
是一个工作ȝ吧,Ƣ迎各位不吝赐教Q如果有什么疑问请通过以下方式联系本h
3、下载安装JDK6
下蝲地址Qhttp://java.sun.com/javase/downloads/?intcmp=1281Q下载Java SE Development Kit (JDK) 6 Update 11?br />
安装JDK的过E非常简单,你只需要依ơ下一步就可以完成d了,安装q程注意选择安装目录Q我们这里假讑֮装目录ؓd:\java\jdk1.6?br />
4、下载Tomcat 6
下蝲地址Qhttp://tomcat.apache.org/download-60.cgiQ选择windowsq_的tomcat软gQ你可以选在Windows Service Installer 版本?br />
5、安装Tomcat 6
q个q程中也是近乎傻瓜型的,q里Tomcat 6的安装过E截囑֦下:
6、下载和配置mod_jk
下蝲地址Qhttp://apache.mirror.phpchina.com/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.27/mod_jk-1.2.27-httpd-2.2.10.soQ这里大安要注意一点,你应该更具你的apache的版本来选择mod_jk的版本。当你现在so文g之后Q接下来的Q务就是要so模块配置到apache服务器当中去?br />
首先mod_jk-1.2.27-httpd-2.2.10.so复制到apache的安装目录中modules目录中,你会在这个目录(C:\Program Files\Apache Software Foundation\Apache2.2\modulesQ中看到很多的so文g。然后打开apache的配|文ӞC:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.confQ,在其中找到包含LoadModule字样的内容,在这些内容的下方d一个新的LoadModuleQ其目的是ؓ了给Apache增加一个新的模块功能,q个模块是mod_jkQ它的目的是Z让apache能够和tomcatq行协作。在LoadModule下方d如下一行内容:
LoadModule jk_module modules/mod_jk-1.2.27-httpd-2.2.10.so
mod_jk模块要正工作,必须知道被它操控的tomcat服务器在哪里Q而这个内定w要被配置在另外一个文件中Q现在我们将q个文g命名为workers.propertiesQ将q个文g攑֜httpd.conf相同的地方(当然你可以放在Q何你希望的地方)Q文件中的内容如下:
ps=\
worker.list=ojava
worker.ojava.port=8009
worker.ojava.type=ajp13
worker.ojava.host=localhost
worker.ojava.lbfactor=1
有了q个配置文g之后Q我们必要告诉mod_jkq个文g的存在,所以需要再ơ打开httpd.conf文gQ在我们刚刚d的LoadModuleq一行的下方d如下一行内容:
JkworkersFile conf/workers.properties
好了Q现在你已经完成了apache和tomcat的通讯方式和参数的配置Q接下来需要做的就是配|哪个web应用需要由apache转交ltomcatq行处理Q我们以虚拟LZQ?br />
我们为apache增加新的虚拟L的配|,首先修改httpd.conf的配|,扑ֈ#Include conf/extra/httpd-vhosts.confQ将q一行前面的#去除掉,让这一行的配置生效。然后我们找到配|文件中如下的内容:
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
其修改为如下的内容Q?br />
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
其目的是Zlapache配置虚拟LQ指定其他目录作为web|站的目录时产生无权讉K的错误?br />
接着打开C:\Program Files\Apache Software Foundation\Apache2.2\conf\extra\httpd-vhosts.confQ去掉里面已l配|的虚拟L部分的内容,如下所C:
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.ojava.net
DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/docs/dummy-host.ojava.net"
ServerName dummy-host.ojava.net
ServerAlias www.dummy-host.ojava.net
ErrorLog "logs/dummy-host.ojava.net-error.log"
CustomLog "logs/dummy-host.ojava.net-access.log" common
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host2.ojava.net
DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/docs/dummy-host2.ojava.net"
ServerName dummy-host2.ojava.net
ErrorLog "logs/dummy-host2.ojava.net-error.log"
CustomLog "logs/dummy-host2.ojava.net-access.log" common
</VirtualHost>
d我们自己配置的信息,配置内容如下Q?br />
<VirtualHost *:80>
ServerAdmin steven@ojava.net
DocumentRoot "e:/ojava/web_root"
ServerName www.ojava.net
JkMount /* ojava
ErrorLog "logs/www.ojava.net-error.log"
CustomLog "logs/www.ojava.net-access.log" common
</VirtualHost>
到这里我们已l将对www.ojava.net域名|站的访问请求{交给了tomcatq行处理了。此时如果你需要在tomcat中进行虚拟主机的配置Q那么你可以l箋修改tomcat的配|文Ӟ如果你不需要,那么到这里,你已l完成了所以的配置q程。恭喜你Q现在重新启动apache和tomcatQ可以测试了Q成功了吗?有问题欢q交?/p>
本文转蝲http://blog.csdn.net/stevencn76/archive/2008/12/22/3584925.aspx
当采?span class="hilite1">tomcat默认集群配置Q?lt;Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>Q时Q配|的l节实际上被省略了,对于大多数应用而言Q用默认配|已l够,完整的默认配|应该是q样Q?/p>
<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>
下面W者对q里的配|项作详l解释,以下内容均是W者阅Mtomcat官方文档后自q理解Q有些可能不对,希望读者能带着批判的眼光阅读,q欢q指正笔者错误?/p>
tomcat集群各节炚w过建立tcp链接来完成Session的拷贝,拯有同步和异步两种模式。在同步模式下,对客L的响应必dSession拯到其他节点完成后q行Q异步模式无需{待Session拯完成可响应。异步模式更高效Q但是同步模式可靠性更高。同步异步模式由channelSendOptions参数控制Q默认值是8Qؓ异步模式Q?是同步模式。在异步模式下,可以通过加上拯认QAcknowledgeQ来提高可靠性,此时channelSendOptions设ؓ10?/p>
Manager用来在节炚w拯SessionQ默认用DeltaManagerQDeltaManager采用的一Uall-to-all的工作方式,即集中的节点会把Session数据向所有其他节Ҏ贝,而不其他节Ҏ否部|了当前应用。当集群中的节点数量很多q且部v着不同应用Ӟ可以使用BackupManagerQBackManager仅向部v了当前应用的节点拯Session。但是到目前为止BackupManagerq未l过大规模测试,可靠性不及DeltaManager?/p>
Channel负责?span class="hilite1">tomcat集群的IO层进行配|。Membership用于发现集群中的其他节点Q这里的address用的是组播地址QMulticast addressQ了解更多组播地址详情请参?a >http://zyycaesar.javaeye.com/admin/blogs/296501Q,使用同一个组播地址和端口的多个节点同属一个子集群Q因此通过自定义组播地址和端口就可将一个大?span class="hilite1">tomcat集群分成多个子集。Receiver用于各个节点接收其他节点发送的数据Q在默认配置?span class="hilite1">tomcat会从4000-4100间依ơ选取一个可用的端口q行接收Q自定义配置Ӟ如果多个tomcat节点在一台物理服务器上注意要使用不同的端口。Sender用于向其他节点发送数据,具体实现通过Transport配置QPooledParallelSender是从tcpq接池中获取q接Q可以实现ƈ行发送,即集中的多个节点可以同时向其他所有节点发送数据而互不媄响。Interceptor有点cM下面要解释的ValveQvC个阀门的作用Q在数据到达目的节点前进行检或其他操作Q如TcpFailureDetector用于在数据的传输过E中是否发生了tcp错误。关于Channel的编E模型,请参?a >http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/tribes/Channel.html?/p>
Valve用于在节点向客户端响应前q行或q行某些操作QReplicationValve是用于用于当前的响应是否涉及Session数据的更斎ͼ如果是则启动Session拯操作Qfilter用于qohQ如客户端对囄QcssQjs的请求就不会涉及SessionQ因此不需,默认状态下不进行过滤,监测所有的响应。JvmRouteBinderValve会在前端的Apache mod_jk发生错误时保证同一客户端的h发送到集群的同一个节点,tomcat官方文档q未解释如何实现q一点,而且W者认一讄gq无多大实用性?/p>
Deployer用于集群的farm功能Q监控应用中文g的更斎ͼ以保证集中所有节点应用的一致性,如某个用户上传文件到集群中某个节点的应用E序目录下,Deployer会监到q一操作q把q一文g拯到集中其他节点相同应用的对应目录下以保持所有应用的一致。这是一个相当强大的功能Q不q很遗憾Q?span class="hilite1">tomcat集群目前q不能做到这一点,开发h员正在努力实现它Q这里的配置只是预留了一个接口?/p>
Listener用于跟踪集群中节点发出和收到的数据,也有点类似Valve的功能?/p>
在大体了解了tomcat集群实现模型后,可以对集群作出更优化的配置了,tomcat推荐了一套配|,使用了比DeltaManager更高效的BackupManagerQƈ且对ReplicationValve讄了请求过滤,注意在一台服务器部v多个节点旉要修改Receiver的侦听端口,另外Qؓ了更高效的在节点间拷贝数据,所?span class="hilite1">tomcat节点最好采用相同的配置Q具体配|如下:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="6">
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
<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="5000"
selectorTimeout="100"
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"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
<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.ClusterSessionListener"/>
</Cluster>
Tomcat集群除了可以q行Session数据的拷贝,q可q行Context属性的拯Q通过修改context.xml的Context配置可以实现Q?lt;Context className="org.apache.catalina.ha.context.ReplicatedContext"/>替换默认Context卛_Q当然也可再加上distributable="true"属性?/p>
下面通过假想的一l场景来描述tomcat集群如何工作Q集采用默认配|,由t1和t2两个tomcat例程l成Q场景按照时间顺序排列?/p>
1. t1启动
t1按照标准?span class="hilite1">tomcat启动Q当Host对象被创建时Q一?span class="hilite2">Cluster对象Q默认配|下是SimpleTcpClusterQ也同时被关联到q个Host对象。当某个应用在web.xml中设|了distributableӞTomcatؓ此应用的上下文环境创Z个DeltaManager。SimpleTcpCluster启动membership服务和Replication服务Q用于徏立tcpq接Q?/p>
2. t2启动Q待t1启动完成后)
首先t2会执行和t1一L操作Q然后SimpleTcpCluster会徏立一个由t1和t2l成的membership。接着t2向集中已启动的服务器即t1hSession数据Q如果t1没有响应t2的拷贝请求,t2会在60U后time out。在Session数据拯完成之前t2不会接收客户端的http或mod_jk/ajph?/p>
3. t1接收httphQ创建Session s1
t1正常响应客户hQ但是在t1把结果发送回客户端时QReplicationValve会拦截当前请求(如果filter中配|了不需拦截的请求类型,q一步就不会q行Q默认配|下拦截所有请求)Q如果发现当前请求更CSessionQ调用Replication服务建立tcpq接把Session拯到membership列表中的其他节点即t2Q返回结果给客户端(注意Q如果采用同步拷贝,必须{拷贝完成后才会q回l果Q异步拷贝在数据发送到tcpq接p回结果,不等待拷贝完成)。在拯Ӟ所有保存在当前Session中的可序列化的对象都会被拯Q而不仅仅是发生更新的部分?/p>
4. t1崩溃
当t1崩溃Ӟt2会被告知t1已从集群中退出,然后t2׃把t1从自qmembership列表中删除,发生在t2的Session更新不再往t1拯Q同时负载均衡器会把后箋的httph全部转发lt2。在此过E中所有的Session数据不会丢失?/p>
5. t2接收s1的请?br />
t2正常响应s1的请求,因ؓt2保存着s1的所有数据?/p>
6. t1重新启动
按步??一L操作启动Q加入集,从t2拯所有Session数据Q拷贝完成后开放自qhttp和mod_jk/ajp端口接收h?/p>
7. t1接收hQs1失效
t1l箋接收来自s1的请求,把s1讄期。这里的q期q因ؓs1处于非活动状态超q设|的旉Q而是执行cM注销的操作而引LSession失效。这时t1q发送s1的所有数据而是一个类似s1 expired的消息,t2收到消息后也会把s1设ؓq期?/p>
8. t2接收hQ创建Session s2
和步?一栗?/p>
9. t1 s2q期
对于因超时引LSession失效t1无需通知t2Q因为t2同样知道s2已经时。因此对?span class="hilite1">tomcat集群有一炚w帔R要,所有节点的操作pȝ旉必须一_不然会出现某个节点Session已过期而在另一节点此Session仍处于活动状态的现象?/p>
#加蝲mod_jk Module LoadModule jk_module modules/mod_jk-1.2.28-httpd-2.2.3.so #指定 workers.properties文g路径 JkWorkersFile conf/workers.properties #指定那些h交给tomcat处理,"controller"为在workers.propertise里指定的负蝲分配控制?br /> JkMount /*.jsp controller |
worker.list = controller,tomcat1,tomcat2 #server 列表 #========tomcat1======== #========tomcat2======== #========controller,负蝲均衡控制?======= |
首先我们先介l一下ؓ什么要?Apache ?Tomcat 之间q行q接。事实上 Tomcat 本n已经提供?HTTP 服务Q该服务默认的端口是 8080Q装?tomcat 后通过 8080 端口可以直接使用 Tomcat 所q行的应用程序,你也可以该端口改ؓ 80?/p>
既然 Tomcat 本n已经可以提供q样的服务,我们Z么还要引?Apache 或者其他的一些专门的 HTTP 服务器呢Q原因有下面几个Q?/p>
1. 提升寚w态文件的处理性能
2. 利用 Web 服务器来做负载均衡以及容?/p>
3. 无缝的升U应用程?/p>
q三点对一?web |站来说是非怹重要的,我们希望我们的网站不仅是速度快,而且要稳定,不能因ؓ某个 Tomcat 宕机或者是升E序D用户讉K不了Q而能完成q几个功能的、最好的 HTTP 服务器也只?apache ?http server 了,它跟 tomcat 的结合是最紧密和可靠的?/p>
接下来我们介l三U方法将 apache ?tomcat 整合在一赗?/p>
q是最常见的方式,你可以在|上扑ֈ很多关于配置JK的网,当然最全的q是其官Ҏ提供的文档。JK 本n有两个版本分别是 1 ?2Q目?1 最新的版本?1.2.19Q而版?2 早已l废弃了Q以后不再有新版本的推出了,所以徏议你采用版本 1?/p>
JK 是通过 AJP 协议?Tomcat 服务器进行通讯的,Tomcat 默认?AJP Connector 的端口是 8009。JK 本n提供了一个监控以及管理的面 jkstatusQ通过 jkstatus 可以监控 JK 目前的工作状态以及对?tomcat 的连接进行设|,如下图所C:
在这个图中我们可以看到当前JK配了两个q接分别?8109 ?8209 端口上,目前 s2 q个q接是停止状态,?s1 q个q接自上ơ重启后已经处理?47 万多个请求,量辑ֈ 6.2 ?GQ最大的q发数有 13 {等。我们也可以利用 jkstatus 的管理功能来切换 JK C同的 Tomcat 上,例如?s2 启用Qƈ停用 s1Q这个在更新应用E序的时候非常有用,而且整个切换q程对用h说是透明的,也就辑ֈ了无~升U的目的。关?JK 的配|文章网上已l非常多了,q里我们不再详细的介l整个配|过E,但我要讲一下配|的思\Q只要明白了配置的思\QJK 是一个非常灵zȝlg?/p>
JK 的配|最关键的有三个文gQ分别是
httpd.conf
Apache 服务器的配置文gQ用来加?JK 模块以及指定 JK 配置文g信息
workers.properties
?Tomcat 服务器的q接定义文g
uriworkermap.properties
URI 映射文gQ用来指定哪?URL ?Tomcat 处理Q你也可以直接在 httpd.conf 中配|这?URIQ但是独立这些配|的好处?JK 模块会定期更新该文g的内容,使得我们修改配置的时候无需重新启动 Apache 服务器?/p>
其中W二、三个配|文件名都可以自定义。下面是一个典型的 httpd.conf ?JK 的配|?/p>
# (httpd.conf) # 加蝲 mod_jk 模块 LoadModule jk_module modules/mod_jk.so # # Configure mod_jk # JkWorkersFile conf/workers.properties JkMountFile conf/uriworkermap.properties JkLogFile logs/mod_jk.log JkLogLevel warn |
接下来我们在 Apache ?conf 目录下新Z个文件分别是 workers.properties、uriworkermap.properties。这两个文g的内容大概如?/p>
# # workers.properties # # list the workers by name worker.list=DLOG4J, status # localhost server 1 # ------------------------ worker.s1.port=8109 worker.s1.host=localhost worker.s1.type=ajp13 # localhost server 2 # ------------------------ worker.s2.port=8209 worker.s2.host=localhost worker.s2.type=ajp13 worker.s2.stopped=1 worker.DLOG4J.type=lb worker.retries=3 worker.DLOG4J.balanced_workers=s1, s2 worker.DLOG4J.sticky_session=1 worker.status.type=status |
以上?workers.properties 配置是我们前面那个屏幕抓图的页面所用的配置。首先我们配|了两个cd?ajp13 ?worker 分别?s1 ?s2Q它们指向同一台服务器上运行在两个不同端口 8109 ?8209 ?Tomcat 上。接下来我们配置了一个类型ؓ lbQ也是负蝲均衡的意思)?workerQ它的名字是 DLOG4JQ这是一个逻辑?workerQ它用来理前面配置的两个物理连?s1 ?s2。最后还配置了一个类型ؓ status ?workerQ这是用来监?JK 本n的模块。有了这三个 worker q不够,我们q需要告?JKQ哪?worker 是可用的Q所以就?worker.list = DLOG4J, status q行配置?/p>
接下来便?URI 的映配|了Q我们需要指定哪些链接是?Tomcat 处理的,哪些是由 Apache 直接处理的,看看下面q个文g你就能明白其中配|的意义
/*=DLOG4J /jkstatus=status !/*.gif=DLOG4J !/*.jpg=DLOG4J !/*.png=DLOG4J !/*.css=DLOG4J !/*.js=DLOG4J !/*.htm=DLOG4J !/*.html=DLOG4J |
怿你已l明白了一大半了:所有的h都由 DLOG4J q个 worker q行处理Q但是有几个例外Q?jkstatus h?status q个 worker 处理。另外这个配|中每一行数据前面的感叹h什么意思呢Q感叹号表示接下来的 URI 不要?JK q行处理Q也是 Apache 直接处理所有的囄、css 文g、js 文g以及静?html 文本文g?/p>
通过?workers.properties ?uriworkermap.properties 的配|,可以有各U各Ll合来满x们前面提出对一?web |站的要求。您不妨动手试试Q?/p>
![]() ![]() |
![]()
|
q是利用 Apache 自带?mod_proxy 模块使用代理技术来q接 Tomcat。在配置之前L保是否用的?2.2.x 版本?Apache 服务器。因?2.2.x 版本对这个模块进行了重写Q大大的增强了其功能和稳定性?/p>
http_proxy 模式是基?HTTP 协议的代理,因此它要?Tomcat 必须提供 HTTP 服务Q也是说必d?Tomcat ?HTTP Connector。一个最单的配置如下
ProxyPass /images ! ProxyPass /css ! ProxyPass /js ! ProxyPass / http://localhost:8080/ |
在这个配|中Q我们把所?http://localhost 的请求代理到 http://localhost:8080/ Q这也就?Tomcat 的访问地址Q除?images、css、js 几个目录除外。我们同样可以利?mod_proxy 来做负蝲均衡Q再看看下面q个配置
ProxyPass /images ! ProxyPass /css ! ProxyPass /js ! ProxyPass / balancer://example/ <Proxy balancer://example/> BalancerMember http://server1:8080/ BalancerMember http://server2:8080/ BalancerMember http://server3:8080/ </Proxy> |
配置?JK 单多了,而且它也可以通过一个页面来监控集群q行的状态,q做一些简单的l护讄?/p>
?2Q监控集运行状?/strong>
![]() ![]() |
![]()
|
ajp_proxy q接方式其实?http_proxy 方式一P都是?mod_proxy 所提供的功能。配|也是一P只需要把 http:// 换成 ajp:// Q同时连接的?Tomcat ?AJP Connector 所在的端口。上面例子的配置可以改ؓQ?/p>
ProxyPass /images ! ProxyPass /css ! ProxyPass /js ! ProxyPass / balancer://example/ <Proxy balancer://example/> BalancerMember ajp://server1:8080/ BalancerMember ajp://server2:8080/ BalancerMember ajp://server3:8080/ </Proxy> |
采用 proxy 的连接方式,需要在 Apache 上加载所需的模块,mod_proxy 相关的模块有 mod_proxy.so、mod_proxy_connect.so、mod_proxy_http.so、mod_proxy_ftp.so、mod_proxy_ajp.soQ?其中 mod_proxy_ajp.so 只在 Apache 2.2.x 中才有。如果是采用 http_proxy 方式则需要加?mod_proxy.so ?mod_proxy_http.soQ如果是 ajp_proxy 则需要加?mod_proxy.so ?mod_proxy_ajp.soq两个模块?/p>
![]() ![]() |
![]()
|
相对?JK 的连接方式,后两U在配置上是比较单的Q灵zL方面也一炚w不逊色。但q定性而言׃?JK q样久经考验Q毕?Apache 2.2.3 推出的时间ƈ不长Q采用这U连接方式的|站q不多,因此Q如果是应用于关键的互联|网站,q是采用 JK 的连接方式?/p>