Apache+Tomcat负载均衡两种session共享方式的设置

释放双眼,带上耳机,听听看~!

**原文地址:**Apache+Tomcat负载均衡两种session共享方式的设置
**作者:**梦回两千载

session共享有两种方式:

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

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

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

 

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

 

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


 

选取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,代码如下:

Apache+Tomcat负载均衡两种session共享方式的设置
LoadModuleproxy_module modules
/
mod_proxy.so
Apache+Tomcat负载均衡两种session共享方式的设置LoadModuleproxy_ajp_module modules
/
mod_proxy_ajp.so
Apache+Tomcat负载均衡两种session共享方式的设置LoadModuleproxy_balancer_module modules
/
mod_proxy_balancer.so 然后在此配置文件末端加入以下代码:

Apache+Tomcat负载均衡两种session共享方式的设置ProxyPass/ balancer://tomcatcluster/ lbmethod=byrequests
stickysession=JSESSIONID nofailover=Off timeout=5maxattempts=3 
 
Apache+Tomcat负载均衡两种session共享方式的设置ProxyPassReverse/balancer://tomcatcluster/ 
 
 
Apache+Tomcat负载均衡两种session共享方式的设置 
 
Apache+Tomcat负载均衡两种session共享方式的设置Proxybalancer://tomcatcluster 
 
Apache+Tomcat负载均衡两种session共享方式的设置BalancerMemberajp://localhost:8009route=a 
 
Apache+Tomcat负载均衡两种session共享方式的设置BalancerMemberajp://localhost:9009 route=b
Apache+Tomcat负载均衡两种session共享方式的设置</Proxy>
以上代码配置了Proxy的相关参数,<Proxy>模块定义了均衡负载的配置,其中两个TomcatServer都配置在同一台服务器上,端口分别为8009、9009,并配置各自的route,这样ApacheServer就能根据route将请求转发给特定的Tomcat。
接下来修改Tomcat的server.xml文件,如下:

Apache+Tomcat负载均衡两种session共享方式的设置

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

Apache+Tomcat负载均衡两种session共享方式的设置 
 
 
 

<
Connector
port
="8009"
Apache+Tomcat负载均衡两种session共享方式的设置 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
enableLookups
="false"
redirectPort
="8443"
protocol
="AJP/1.3"
/> 其中的port为前面<Proxy>中设定的端口,还要配置其route,代码如下:

Apache+Tomcat负载均衡两种session共享方式的设置

<!–
Define the top level container in ourcontainer hierarchy
–>

Apache+Tomcat负载均衡两种session共享方式的设置 
 
 
 

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

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

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

Apache+Tomcat负载均衡两种session共享方式的设置HTTPresponse headers:
Apache+Tomcat负载均衡两种session共享方式的设置HTTP/1.1200 OK
Apache+Tomcat负载均衡两种session共享方式的设置Date:Wed, 11 Jul 2007 02:17:55 GMT
Apache+Tomcat负载均衡两种session共享方式的设置Set-Cookie:
JSESSIONID=AC7EF1CAA8C6B0FEB68E77D7
D375E2AF.b;Path=/jsp-examples
Apache+Tomcat负载均衡两种session共享方式的设置Content-Type:text/html;charset=ISO-8859-1
Apache+Tomcat负载均衡两种session共享方式的设置Content-Length:3
Apache+Tomcat负载均衡两种session共享方式的设置Keep-Alive:timeout=5, max=79
Apache+Tomcat负载均衡两种session共享方式的设置Connection:Keep-Alive

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

 

二、采用Session复制

修改apache http server配置文件http.conf,首先load三个model,代码如下:

Apache+Tomcat负载均衡两种session共享方式的设置
LoadModuleproxy_module modules
/
mod_proxy.so
Apache+Tomcat负载均衡两种session共享方式的设置LoadModuleproxy_ajp_module modules
/
mod_proxy_ajp.so
Apache+Tomcat负载均衡两种session共享方式的设置LoadModuleproxy_balancer_module modules
/
mod_proxy_balancer.so

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

Apache+Tomcat负载均衡两种session共享方式的设置ProxyPass/ balancer://tomcatcluster/

Apache+Tomcat负载均衡两种session共享方式的设置ProxyPassReverse/balancer://tomcatcluster/ 
 
 
Apache+Tomcat负载均衡两种session共享方式的设置 
 
Apache+Tomcat负载均衡两种session共享方式的设置Proxybalancer://tomcatcluster 
 
Apache+Tomcat负载均衡两种session共享方式的设置BalancerMemberajp://localhost:8009route=a 
 
Apache+Tomcat负载均衡两种session共享方式的设置BalancerMemberajp://localhost:9009 route=b
Apache+Tomcat负载均衡两种session共享方式的设置</Proxy>
接下来修改Tomcat的server.xml文件,如下:

Apache+Tomcat负载均衡两种session共享方式的设置

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

Apache+Tomcat负载均衡两种session共享方式的设置 
 
 
 

<
Connector
port
="8009"
Apache+Tomcat负载均衡两种session共享方式的设置 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
enableLookups
="false"
redirectPort
="8443"
protocol
="AJP/1.3"
/> 其中的port为前面<Proxy>中设定的端口,还要配置其route,代码如下:

Apache+Tomcat负载均衡两种session共享方式的设置

<!–
Define the top level container in ourcontainer hierarchy
–>

Apache+Tomcat负载均衡两种session共享方式的设置 
 
 
 

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

jvmRoute也须同前面的设置一样。
另外,还需要在tomcat中将以下配置打开:

 
<ClusterclassName="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown
="false"
useDirtyFlag="true"
notifyListenersOnReplica
tion="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"/>

           <ValveclassName="org.apache.catalina.cluster.tcp.ReplicationValve"                   filter=".*.gif;.*.js;.*.jpg;.*.png;.*.htm;.*.html;.*.css;.*.txt;"/>                               <DeployerclassName="org.apache.catalina.cluster.deploy.FarmWarDeployer"                      tempDir="/tmp/war-temp/"                      deployDir="/tmp/war-deploy/"                      watchDir="/tmp/war-listen/"                      watchEnabled="false"/>                                  <ClusterListenerclassName="org.apache.catalina.cluster.session.ClusterSessionListener"/>        </Cluster> 最后,要在我们的应用程序里的web-inf下的web.xml文件<web-app>元素的最后加上:<distributable/>

给TA打赏
共{{data.count}}人
人已打赏
安全经验

人们为何痛恨Google Adsense

2021-10-11 16:36:11

安全经验

安全咨询服务

2022-1-12 14:11:49

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索