2013-09-13 15:45:06
来 源
ITJS.CN
Apache
该篇讲述Apache和Tomcat服务器负载均衡两种session共享方式的设置方法,希望对于初学Apache服务器相关的朋友有帮助,更多Apache安装、配置、报错处理等资源请本站内搜索。

session共享有两种方式:

1、session共享,多个服务器session拷贝保存,一台宕机不会影响用户的登录状态;

2、请求精确集中定位,即当前用户的请求都集中定位到一台服务器中,这样单台服务器保存了用户的session登录信息,如果宕机,则等同于单点部署,会丢失;

apache中针对上述两个方法提供了不同的配置项:

session replication:会话复制,即上述的方法一;

session sticky:会话不复制,即上述的方法二;

-------------------------------

选取Apache HTTP Server作为前端的负载服务器,后端选取两个Tomcat作集群。

一、采用粘性Session

这种方式将同一用户的请求转发到特定的Tomcat服务器上,避免了集群中Session的复制,缺点是用户只跟一种的一台服务器通信,如果此服务器down掉,那就废了。

采用的model为mod_proxy_ajp.so,整个配置在tomcat的配置文件中都有相关的注释,只需作相应修改就OK。

我们选取的是Apache HTTP Server2.2.4,Tomcat5.5.16。

首先安装Apache HTTP Server,然后修改其配置文件http.conf,首先load三个model,

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 然后在此配置文件末端加入以下代码:

以上代码配置了Proxy的相关参数,模块定义了均衡负载的配置,其中两个Tomcat Server都配置在同一台服务器上,端口分别为8009、9009,并配置各自的route,这样Apache Server就能根据route将请求转发给特定的Tomcat。

接下来修改Tomcat的server.xml文件,如下:

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

<Connector port="8009"

enableLookups="false" redirectPort="8443" protocol="AJP/1.3" /> 其中的port为前面中设定的端口,还要配置其route,

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

<Engine name="Catalina" defaultHost="localhost" jvmRoute="a"> jvmRoute也须同前面的设置一样。

下面用JMeter对配置后的负载均衡做一测试,首先先启动两个Tomcat Server,随后启动Apache Server,在JMeter中新建测试计划,在两个Tomcat Server中的jsp-examples下新建test.jsp(此jsp自己随便写两句就成),然后进行测试,以下是部分取样器结果:

以上红色代码表示用户的http请求中的JSESSIONID中已经附带了route后缀,.b表示此请求将转发到route为b的Tomcat Server上,你将会发现其中的一部分请求的JSESSIONID后缀为.a,也就是转发给route为a的Tomcat Server上。

二、采用Session复制

修改apache http server配置文件http.conf,首先load三个model,

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

然后在此配置文件末端加入以下代码:

接下来修改Tomcat的server.xml文件,如下:

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

<Connector port="8009"

enableLookups="false" redirectPort="8443" protocol="AJP/1.3" /> 其中的port为前面中设定的端口,还要配置其route,

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

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

jvmRoute也须同前面的设置一样。

另外,还需要在tomcat中将以下配置打开:

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

tcpSelectorTimeout="100"

tcpThreadCount="6"/>

<Sender

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

replicationMode="pooled"

ackTimeout="15000"

waitForAck="true"/>

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

最后,要在我们的应用程序里的web-inf下的web.xml文件<web-app>元素的最后加上: <distributable/> 。

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