2014-01-03 10:11:01
来 源
kejihao
Apache
本文介绍Apache2.2.X+Tomcat5.x使用mod_proxy方式配置负载均衡集群,希望对于初学Apache服务器相关的朋友有帮助,更多Apache安装、配置、报错处理等资源请本站内搜索。

使用Apache做集群及负载均衡的方式一般有两种:mod_jk和mod_proxy两种。

本人尝试过用mod_jk的方式配置过,但都不是很成功,apache2.2.x后已经将mod_proxy集成进来,无需使用其他软件、插件,通过配置就可以完成与tomcat的集成。下面讲述以mod_proxy方式配置情况: 

环境:windowsxp,apache2.2.x,tomcat5.5,jdk1.5.0,tomcat放在同一台机器上,3份。

安装过程略。。。,以下讲述配置过程 

1、Apache配置

1.1 httpd.conf配置

修改APACHE的配置文件D:Apache confhttpd.conf

将以下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   

    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

再找到加上index.jsp修改成,我项目的默认欢迎页面是index.jsp,记得与前一个之前用空隔分隔。 

   

<IfModule dir_module>  

DirectoryIndex index.html index.jsp main.html   

</IfModule>  

<IfModule dir_module>

DirectoryIndex index.html index.jsp main.html

</IfModule>

   接着找到以下这两行,把下面一行的#号去掉,表示将 conf/extra/httpd-vhosts.conf配置文件加进来 

# Virtual hosts    

Include conf/extra/httpd-vhosts.conf   

# Virtual hosts

   Include conf/extra/httpd-vhosts.conf

   最后,在文件最后加上以下内容,表示打开反向代理。 这个很重要,我的项目之前就是没有加上这几行,只能显示index.jsp页面的内容,登录成功后去不能正确跳转到相关页面,还是返回到index.jsp页面。反向代理可以基于一整个站点,也可以基于一个目录。 

ProxyRequests Off   

<Proxy *:80>    

Order deny,allow    

Allow from all    

</Proxy>   

ProxyRequests Off

<Proxy *:80>

Order deny,allow

Allow from all

</Proxy>

2.2 http-vhost.conf配置

修改conf/extra/httpd-vhosts.conf

在文件最后加上以下代码

  

<VirtualHost *:80>  

ServerAdmin [email protected]   

ServerName localhost   

ServerAlias localhost   

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

ProxyPassReverse / balancer://cluster/   

<proxy balancer://cluster>  

BalancerMember ajp://127.0.0.1:8009 loadfactor=1 route=s1  

BalancerMember ajp://127.0.0.1:8109 loadfactor=1 route=s2  

BalancerMember ajp://127.0.0.1:8209 loadfactor=1 route=s3  

</proxy>  

</VirtualHost>  

<VirtualHost *:80>

ServerAdmin [email protected]

ServerName localhost

ServerAlias localhost

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

ProxyPassReverse / balancer://cluster/

<proxy balancer://cluster>

BalancerMember ajp://127.0.0.1:8009 loadfactor=1 route=s1

BalancerMember ajp://127.0.0.1:8109 loadfactor=1 route=s2

BalancerMember ajp://127.0.0.1:8209 loadfactor=1 route=s3

</proxy>

</VirtualHost>

说明:

均衡器粘连会话名称。该值常常会被设置为类似JSESSIONID或者PHPSESSIONID之类的值,他依赖于支持会话的后端应用服务器。如果后端服务器使用不同的cookie名称或者URL编码的ID(像servlet容器),使用|来分开他们。第一个部分针对cookie,第二个针对路径。

每次请求都按照负载均衡配置的节点次序依次请求到不同的Tomcat上。尤其是当我们通过jvmRoute 和route 做了绑定之后,信息更加准确。但是,仔细观察,每次请求的SessionID都是不一样! 对于纯Web应用,尤其是依靠SessionID区分唯一用户的应用,这将是一场噩梦——解决了服务器压力均衡问题,却带来了SessionID不唯一问题!这就需要SessionID绑定,或者说叫做“会话复制”。 stickySession 粘性会话,根据这一属性,浏览器将通过cookie绑定SeesionID。如果这个时候再次访问http://localhost/zlex ,你会发现,页面不会来回跳转了!

引用:     

sticky模式

利用负载均衡器的sticky模式的方式把所有同一session的请求都发送到相同的Tomcat节点。这样不同用户的请求就被平均分配到集群 中各个tomcat节点上,实现负载均衡的能力。这样做的缺点是没有灾难恢复的能力。一旦一个节点发生故障,这个节点上所有的session信息全部丢 失;

同一用户同一session只和一个webServer交互,一旦这个webserver发生故障,本次session将丢失,用户不能继续使用 !

   BalancerMember 是负载均衡参与的成员定义,与tomcat的ajp协议通讯。上面红色的端口号分别是三个tomcat的conf/server.xml中的配置的AJP/1.3协议连接器,由于在同一台机器上部署,所以三个tomcat中的这个端口都要改成不一样的,我这里分别改成8009,8109,8209。紧接着是route设置,值与每个tomcat的配置对应上,下面会说明。

   2、Tomcat的配置说明

   1、server.xml配置

修改%TOMCAT_HOME%confserver.xml

由于三个tomcat都部署在一台机器上,所以相关会引起冲突的端口都要改,分别是:

shutdow,http connector,ajp connector,以下是三个tomcat server.xml文件中三个端口的配置清单:

tomcat s1:

<Server port="8905" shutdown="SHUTDOWN" debug="0">   

....   

<Connector port="9000"  

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

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

debug="0" connectionTimeout="20000"    

disableUploadTimeout="true" />   

....   

<Connector port="8009"    

enableLookups="false" redirectPort="8443" debug="0"  

protocol="AJP/1.3" />  

<Server port="8905" shutdown="SHUTDOWN" debug="0">

....

 <Connector port="9000"

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

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

debug="0" connectionTimeout="20000"

disableUploadTimeout="true" />

....

 <Connector port="8009"

enableLookups="false" redirectPort="8443" debug="0"

protocol="AJP/1.3" />

   Tomcat s2 

  

<Server port="8915" shutdown="SHUTDOWN" debug="0">  

....   

<Connector port="9100"  

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

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

debug="0" connectionTimeout="20000"    

disableUploadTimeout="true" />  

....   

<Connector port="8109"    

enableLookups="false" redirectPort="8443" debug="0"  

protocol="AJP/1.3" />  

<Server port="8915" shutdown="SHUTDOWN" debug="0">

....

 <Connector port="9100"

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

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

debug="0" connectionTimeout="20000"

disableUploadTimeout="true" />

....

 <Connector port="8109"

enableLookups="false" redirectPort="8443" debug="0"

protocol="AJP/1.3" />

Tomcat s3

<Server port="8925" shutdown="SHUTDOWN" debug="0">  

....   

<Connector port="9200"  

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

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

debug="0" connectionTimeout="20000"    

disableUploadTimeout="true" />  

....   

<Connector port="8209"    

enableLookups="false" redirectPort="8443" debug="0"  

protocol="AJP/1.3" />  

<Server port="8925" shutdown="SHUTDOWN" debug="0">

....

 <Connector port="9200"

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

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

debug="0" connectionTimeout="20000"

disableUploadTimeout="true" />

....

 <Connector port="8209"

enableLookups="false" redirectPort="8443" debug="0"

protocol="AJP/1.3" />    以上的AJP端口与apache http-vhost.conf中的BalancerMember 的ajp端口对应。

接着找到的,加上jvmRoute="xx"属性,xx要与apache http-vhost.conf中的BalancerMember 的ajp route定义一致。以下是三个tomcat的engine设置 

Tomcat s1 

   

<Engine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="s1">  

 <Engine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="s1">

   Tomcat s2

<Engine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="s2">  

 <Engine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="s2">

Tomcat s3    

   

<Engine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="s3">  

 <Engine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="s3">

接着到到Cluster配置段,将这一段的注释符号去掉,如下: 

 

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

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

expireSessionsOnShutdown="false"  

useDirtyFlag="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="4001"  

tcpSelectorTimeout="100"  

tcpThreadCount="6"/>  

<Sender  

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

replicationMode="pooled"/>  

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

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

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

tempDir="/tmp/war-temp/"  

deployDir="/tmp/war-deploy/"  

watchDir="/tmp/war-listen/"  

watchEnabled="false"/>  

</Cluster>  

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

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

expireSessionsOnShutdown="false"

useDirtyFlag="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="4001"

tcpSelectorTimeout="100"

tcpThreadCount="6"/>

<Sender

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

replicationMode="pooled"/>

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

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

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

tempDir="/tmp/war-temp/"

deployDir="/tmp/war-deploy/"

watchDir="/tmp/war-listen/"

watchEnabled="false"/>

</Cluster>

注意:如果同一台设备上有多个tomcat,这个tcpListenPort就中设置不同的端口号,以免冲突。

所以三个tomcat的这个端口分别是4001、4002、4003。

3、其它配置

执行以上步骤基本已经可以成功了,当然还要设置你的webapp,这个不在此累赘了。当然最好还要设置JAVA_HOME,PATH,CLASSPATH这些环境变量,比如将%JAVA_HOME%libtools.jar和%JAVA_HOME%librt.jar两个包加到类路径内。

还有<distributable/>元素,有些文章说还要将元素加到项目的web.xml文件中,我也加了,但没有验证它的存在对运行有没有影响,大家如果碰到问题,也不防加上。

</script>

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