你的位置:首页 > ASP.net教程

[ASP.net教程]【电商】nginx+redis+tomcat实现session共享集群


本文记录nginx+redis+tomcat实现session共享的过程

tomcat-redis-session-manager组件:https://github.com/jcoleman/tomcat-redis-session-manager

tomcat-redis-sessoin-manager对tomcat的支持:

(1) tomcat6:支持,要求jdk为1.6, 需要引入tomcat-redis-session-manager-1.2-tomcat-6.jar,不过现在已经处理不维护的状态

(2) tomcat7:支持,jdk可以是1.6或1.7,需要引入tomcat-redis-session-manager-1.2-tomcat-7.jar; 如果引入的是tomcat-redis-session-manager-1.2-tomcat-7-java-7.jar则仅支持JDK1.7

(3) tomcat8:目前不支持, 可以尝试一下https://github.com/chexagon/redis-session-manager(未实际验证)

组件下载:https://github.com/jcoleman/tomcat-redis-session-manager/downloads

 

使用组件版本

nginx:1.8.0

tomcat两个:6.0.44 

redis:2.4.10

JDK:1.6.0_34

 

(1) 将下面所有依赖的这些jar包放在$TOMCAT_HOME/lib中:

jedis-2.0.0.jar  tomcat-redis-session-manager-1.2-tomcat-6.jar commons-pool-1.5.5.jar

(2) 两个tomcat分别配置conf/context. 收藏代码

  1. <Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />  
  2. <Manager className="com.radiadesign.catalina.session.RedisSessionManager"  
  3.          host="localhost"   
  4.          port="6379"  
  5.          database="0"   
  6.          maxInactiveInterval="60" />  

<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" /><Manager className="com.radiadesign.catalina.session.RedisSessionManager"     host="localhost"     port="6379"     database="0"     maxInactiveInterval="60" />

 

另外,分别配置两个tomcat的HTTP监听端口为6181和6182

(3) nginx配置:

   

Java代码 复制代码 收藏代码

  1. upstream cluster_redis {    
  2.         server localhost:6181;    
  3.         server localhost:6182;    
  4.    }    
  5.    server {    
  6.        listen 6180;    
  7.        server_name localhost;    
  8.        location / {    
  9.          proxy_pass http://cluster_memcached;    
  10.        }    
  11.    }    

upstream cluster_redis {     server localhost:6181;     server localhost:6182;   }   server {     listen 6180;     server_name localhost;     location / {      proxy_pass http://cluster_memcached;     }   } 

 

 这里配置nginx监听端口为6180,并请所有的请求反向代理到6181和6182的tomcat集群.

 

(4) 测试代码session.jsp:

Jsp代码 复制代码 收藏代码

  1. <%@ page import="java.util.Enumeration" %>    
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" %>    
  3. <html>    
  4. <head>    
  5.     <title>session test</title>    
  6.   <%    
  7.     String key = request.getParameter("sessionKey");    
  8.     String value = request.getParameter("sessionValue");    
  9.     if(key != null && !"".equalsIgnoreCase(key.trim())) {    
  10.       session.setAttribute(key, value);    
  11.     }    
  12.   %>    
  13. </head>    
  14. <body>    
  15. <form action="session.jsp" method="post">    
  16. <input type="text" name="sessionKey" value="key1"><input type="text" name="sessionValue" value="value1">    
  17. <input type="submit" value="提交">    
  18. </form>    
  19. <h4>已经存储的session--<%=session.getServletContext().getRealPath("/")%></h4>    
  20. <table>    
  21.   <tr>    
  22.   <th>key</th>    
  23.   <th>value</th>    
  24.   </tr>    
  25.   <%    
  26.   Enumeration<String> keys = session.getAttributeNames();    
  27.     while(keys.hasMoreElements()){    
  28.       String k = keys.nextElement();    
  29.       String v = (String)session.getAttribute(k);    
  30.       %>    
  31.   <tr>    
  32.     <td><%=k%></td>    
  33.     <td><%=v%></td>    
  34.   </tr>    
  35.   <%    
  36.     }    
  37.   %>    
  38. </table>    
  39. </body>    
  40. </html>    

<%@ page import="java.util.Enumeration" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head>   <title>session test</title>  <%   String key = request.getParameter("sessionKey");   String value = request.getParameter("sessionValue");   if(key != null && !"".equalsIgnoreCase(key.trim())) {    session.setAttribute(key, value);   }  %> </head> <body> <form action="session.jsp" method="post"> <input type="text" name="sessionKey" value="key1"><input type="text" name="sessionValue" value="value1"> <input type="submit" value="提交"> </form> <h4>已经存储的session--<%=session.getServletContext().getRealPath("/")%></h4> <table>  <tr>  <th>key</th>  <th>value</th>  </tr>  <%  Enumeration<String> keys = session.getAttributeNames();   while(keys.hasMoreElements()){    String k = keys.nextElement();    String v = (String)session.getAttribute(k);    %>  <tr>   <td><%=k%></td>   <td><%=v%></td>  </tr>  <%   }  %> </table> </body> </html> 

 

 

需要注意的是,tomcat-redis-session-manager组件并不提供redis集群的支持。对该问题,作者的解释是推荐使用twitter的twemproxy或者碗豆荚的codis之类的redis代理服务。

java企业级通用权限安全框架源码 SpringMVC mybatis or hibernate+ehcache shiro druid bootstrap HTML5

【java框架源码下载】