blueice 发表于 2016-12-20 10:03:26

【电商】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.xml,增加:

<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配置:

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:

<%@ 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代理服务。
  codis的相关资源:
  codis地址:https://github.com/wandoulabs/codis
页: [1]
查看完整版本: 【电商】nginx+redis+tomcat实现session共享集群