session会话保持之session服务器
实验环境:
两个tomcat节点:172.16.100.70(tomcatA.test.com),172.16.100.80(tomcatB.test.com)
两个memcached节点:172.16.100.90, 172.16.100.100
一个负载均衡节点:172.16.100.60
memcached-session-manager项目地址,http://code.google.com/p/memcached-session-manager/
下载如下jar文件至各tomcat节点的tomcat安装目录下的lib目录中,其中的${version}要换成你所需要的版本号,tc${6,7,8}要换成与tomcat版本相同的版本号。
memcached-session-manager-${version}.jar
memcached-session-manager-tc${6,7,8}-${version}.jar
spymemcached-${version}.jar
msm-javolution-serializer-${version}.jar 内存保持至memcache
javolution-${version}.jar
分别在两个tomcat上的某host上定义一个用于测试的context容器,并在其中创建一个会话管理器,如下所示:
<Context path="/test" docBase="/webapps/test" reloadable="true">
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.16.100.9:11211,n2:172.16.100.10:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"/></Context>
分别为两个context提供测试页面:
tomcatA:
# mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}
# vim /usr/local/tomcat/webapps/test/index.jsp
添加如下内容:
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA.test.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("test.com","test.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
tomcatB:
# mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}
# vim /usr/local/tomcat/webapps/test/index.jsp
添加如下内容:
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="blue">TomcatB.test.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("test.com","test.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
在172.16.100.60上配置反向代理的负载均衡内容,类似如下所示:
upstream vmserver{
server 172.16.100.70:8080;
server 172.16.100.80:8080;
}
location / {
add_header X-Via $upstream_addr;
proxy_pass http://vmserver;
index index.jsp index.html;
}
测试结果,在浏览器中访问http://172.16.100.6O/test,结果如下所示,其session ID在负载均衡环境中保持不变。
TomcatA.test.com
Session ID4DD0340CE629BAF2BBEBB2CD4CD0DDDF-n2
Created on4444890838103
TomcatB.test.com
Session ID4DD0340CE629BAF2BBEBB2CD4CD0DDDF-n2
Created on4444890838103
注意:如果你是上面所示的方法设置的Session ID显示是没问题
如果你想测试结果,能直接在浏览器中访问http://172.16.100.6O/那么nginx的设置如下
upstream vmserver{
server 172.16.100.70:8080;
server 172.16.100.80:8080;
}
location / {
add_header X-Via $upstream_addr;
proxy_pass http://vmserver;
index index.jsp index.html;
}
这时候就涉及到会话丢失问题了。
nginx会话丢失问题
nginx代理是出现会话丢失
proxy_cookie_path /test/ /;
proxy_cookie_path路径更换;
发生会话丢失的原因。访问的时候是/ 代理到/test
下次访问时你可以直接持http://xx/test
它的cookie就是test
但是你访问的时候是/
这时候你就需要
proxy_cookie_path /test/ /;
proxy_cookie_path路径更换;
正确设置如下:
upstream vmserver{
server 172.16.100.70:8080;
server 172.16.100.80:8080;
}
location / {
add_header X-Via $upstream_addr;
proxy_pass http://vmserver/test;
proxy_cookie_path /test/ /;
index index.jsp index.html;
}