apache+Tomcat集群下session复制

原地址:https://blog.csdn.net/weiweiai123456/article/details/41750887


因为工作需要,本人需要在本机上做一个apache负载均衡Http请求,交给Tomcat集群处理,并且Session要在不同的Tomcat上进行复制的Demo。现贴出过程如下:

http://wenku.baidu.com/link?url=1Wy1oeJDLaBxnSTPLH0NPyYy0EGP1JokrYQfQhFj_uOt4Dhyh8Kg-q3N1TZhemu8otIHuK5JPrTOpXHAAu9fD1Q9sWFT-MhMm73n3uEz9KO           --好文章,重点推荐

http://www.open-open.com/lib/view/open1375282916217.html   --配合JK插件apache负载均衡

http://nanquan.iteye.com/blog/1533906  

http://jackandroid.iteye.com/blog/627147

http://www.cnblogs.com/peter9/archive/2011/12/18/2362138.html


一:准备工作

[html]  view plain  copy
  1. LoadModule proxy_module modules/mod_proxy.so  
  2. LoadModule proxy_ajp_module modules/mod_proxy_ajp.so  
  3. LoadModule proxy_balancer_module modules/mod_proxy_balancer.so  
  4. LoadModule proxy_connect_module modules/mod_proxy_connect.so  
  5. LoadModule proxy_ftp_module modules/mod_proxy_ftp.so  
  6. LoadModule proxy_http_module modules/mod_proxy_http.so  
  7. LoadModule proxy_scgi_module modules/mod_proxy_scgi.so  
  8. #LoadModule reqtimeout_module modules/mod_reqtimeout.so  
  9. #LoadModule rewrite_module modules/mod_rewrite.so  
  10. LoadModule setenvif_module modules/mod_setenvif.so  

基本知识:
apache是http服务器,根据一定的配置,使用反向代理,处理http请求并转发给相应的tomcat进行处理。session的复制有两种方法。

1.1.粘性session。

同一个窗口的请求会交给同一个tomcat处理,避免了Session在不同的Tomcat之间跳来跳去。缺点是这台Tomcat挂掉则session就会空了。
需要在workers.properties文件中配置如下:
[html]  view plain  copy
  1. worker.lbcontroller.sticky_session=True  

1.2.session复制

通过广播的形式进行不同tomcat间session的复制,对服务器性能有影响,需要在web.xml中配置如下:
[html]  view plain  copy
  1. <distributable/>    

1.3.apache配置

1.3.1.httpd.conf配置

httpd-vhosts.conf


进入到httpd.conf目录文件:
[html]  view plain  copy
  1. LoadModule proxy_module modules/mod_proxy.so  
  2. LoadModule proxy_ajp_module modules/mod_proxy_ajp.so  
  3. LoadModule proxy_balancer_module modules/mod_proxy_balancer.so  
  4. LoadModule proxy_connect_module modules/mod_proxy_connect.so  
  5. LoadModule proxy_ftp_module modules/mod_proxy_ftp.so  
  6. LoadModule proxy_http_module modules/mod_proxy_http.so  
  7. LoadModule proxy_scgi_module modules/mod_proxy_scgi.so  
去掉这七行前的注释,开启这些模块。

[html]  view plain  copy
  1. Include conf/extra/httpd-vhosts.conf  
找到如上代码行,去掉注释

进入到httpd.conf文件最低行,添加如下:
[html]  view plain  copy
  1. #分配请求  
  2. ProxyRequests Off     
  3. <proxy balancer://cluster>      
  4.     BalancerMember ajp://127.0.0.1:9009 loadfactor=1 route=tomcat1   
  5.     BalancerMember ajp://127.0.0.1:10009 loadfactor=1 route=tomcat2  
  6. </proxy>   
这里127.0.0.1表示本地测试环境,类似localhost,要注意参数9009和route,这里表示apache会根据一定规则把请求分发给本地的9009端口,叫做tomcat1的Tomcat上和本地的10009端口,叫做tomcat2的Tomcat上。

1.3.1.httpd-vhosts.conf配置

进入到httpd-vhosts.conf,最后一行添加如下代码,虚拟站点:
[html]  view plain  copy
  1. <VirtualHost *:80>              
  2.     ServerAdmin [email protected]             
  3.     ServerName 127.0.0.1            
  4.     ServerAlias localhost              
  5.     ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On             
  6.     ProxyPassReverse / balancer://cluster/             
  7.     ErrorLog "logs/lbtest-error.log"             
  8.     CustomLog "logs/lbtest-access.log" common         
  9. </VirtualHost>  


三:Tomcat配置

我有两个tomcat,如图:


这里科普下:我因为是在本机上测试,所以不同的Tomcat的相关端口是不能重复的。
Tomcat中有三种端口,admin port端口(默认8005),http端口(默认8080),AJP端口(默认8009)。
首先修改tomcat1的相关端口配置,在server.xml



Tomcat1:

3.1.修改服务器端口为9005




3.2.修改连接端口为9080




3.3.修改jvmRoute和相关ajp端口


注意这里和之前的apache中配置匹配:如下:
[html]  view plain  copy
  1. BalancerMember ajp://127.0.0.1:9009 loadfactor=1 route=tomcat1   

3.4.tomcat配置中开启Session复制

找到如下代码:
[html]  view plain  copy
  1. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  channelSendOptions="8"> </span>  
在其下面加入如下语句:


Tomcat2上配置类似。

四:应用配置

4.1.Tomcat1上建立应用目录:





4.2.Tomcat1上test.jsp:

[html]  view plain  copy
  1.   <%@ page contentType="text/html; charset=UTF-8" %>  
  2. <%@ page import="java.util.*" %>  
  3. <html><head><title>Tomcat Cluster Demo</title></head>  
  4. <body>  
  5. Server Info:  
  6. <%  
  7. out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>  
  8. <%  
  9.   out.println("<br> ID " + session.getId()+"<br>");  
  10.     
  11.   String dataName = request.getParameter("dataName");  
  12.   if (dataName != null && dataName.length() > 0) {  
  13.      String dataValue = request.getParameter("dataValue");  
  14.      session.setAttribute(dataName, dataValue);  
  15.      System.out.println("application:" + application.getAttribute(dataName));  
  16.      application.setAttribute(dataName, dataValue);  
  17.   }  
  18.   out.print("<b>Session List</b>");  
  19.   Enumeration<String> e = session.getAttributeNames();  
  20.   while (e.hasMoreElements()) {  
  21.      String name = e.nextElement();  
  22.      String value = session.getAttribute(name).toString();  
  23.      out.println( name + " = " + value+"<br>");  
  24.          System.out.println( name + " = " + value);  
  25.    }  
  26. %>  
  27.   <form action="test.jsp" method="POST">  
  28.     Name:<input type=text size=20 name="dataName">  
  29.      <br>  
  30.     Value:<input type=text size=20 name="dataValue">  
  31.      <br>  
  32.     <input type=submit>  
  33.    </form>  
  34. </body>  
  35. </html>  

4.3.Tomcat1上web.xml:

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">   
  3.   <display-name>test</display-name>   
  4.    <distributable/>   
  5. </web-app>   
重点是:
[html]  view plain  copy
  1. <distributable/>   

五:测试

输入url,apache会进行转发


刷新到Tomcat1:


刷新到Tomcat2:


不停刷新,不同的tomcat上获取相同的SessionId,且Session中存的值也一样,完成了session复制

猜你喜欢

转载自blog.csdn.net/qq_36350477/article/details/79693234