Nginx的session一致性问题
http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,
因为它记不住你。
那么,在一些场合,确实需要服务器记住当前用户怎么办?
比如用户登录邮箱后,接下来要收邮件、写邮件,总不能每次操作都让用户输入用户名和密码吧,
为了解决这个问题,session的方案就被提了出来,
事实上它并不是什么新技术,而且也不能脱离http协议以及任何现有的web技术
关于Session:
session的常见实现形式是会话cookie(session cookie),
即未设置过期时间的cookie,
这个cookie的默认生命周期为浏览器会话期间,
只要关闭浏览器窗口,cookie就消失了。
实现机制是当用户发起一个请求的时候,
服务器会检查该请求中是否包含sessionid,如果未包含,
则系统会创造一个名为JSESSIONID的输出 cookie返回给浏览器(只放入内存,并不存在硬盘中),
并将其以HashTable的形式写到服务器的内存里面;
当已经包含sessionid时,服务端会检查找到与该session相匹配的信息,
如果存在则直接使用该sessionid,
若不存在则重新生成新的session。
这里需要注意的是session始终是有服务端创建的,并非浏览器自己生成的。
但是浏览器的cookie被禁止后session就需要用get方法的URL重写的机制
或使用POST方法提交隐藏表单的形式来实现
Session共享
首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,
那么是不存在这个问题的,因为会话数据就在这台机器,
但是如果你使用了负载均衡把请求分发到不同的机器呢?
这个时候会话id在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,
而它的session数据可能存在其中一台机器,
这个时候就会出现取不到session数据的情况,于是session的共享就成了一个问题
Session一致性解决方案
1>、session复制
tomcat 本身带有复制session的功能。(不选择这种方案)
2>、共享session
需要专门管理session的软件,
memcached 缓存服务,可以和tomcat整合,帮助tomcat
共享管理session。
怎么解决?准备两台Linux主机分别是192.168.230.10以及192.168.230.11
在192.168.230.10进行如下操作:
1、安装memcached缓存数据库
[root@node1 ~]# yum install memcached
[root@node1 ~]# yum -y install telnet
[root@node1 ~]# service memcached start
[root@node1 ~]# ps -aux | grep 11211
2、tomcat配置名称和session一致性配置
2.1、将jar包上传到tomcat的lib包中
2.2、在tomcat的server.xml中配置jvmRoute
进入tomcat的conf目录找到server.xml文件,并编辑
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
2.4、在context.xml的Context配置 Manager
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.230.10:11211"
sticky="false"
lockingMode="auto"
sessionBackupAsync="false"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sessionBackupTimeout="1000"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
3、配置nginx负载均衡
因为session一致性问题是在nginx负载均衡下出现的
3.1、进入tengine的conf目录
[root@node1 ~]# cd /opt/modules/tengine-2.1.0/conf
3.2、编辑nginx.conf文件
[root@node1 conf]# vi nginx.conf
upstream sparsematrix {
server 192.168.230.10:8080 weight=1;
server 192.168.230.11:8080 weight=1;
}
server {
listen 80;
server_name www.sparsematrix.com;
location / {
proxy_pass http://sparsematrix;
}
}
3.3、重新启动nginx服务
[root@node1 init.d]# service nginx stop
Stopping nginx: [ OK ]
[root@node1 init.d]# service nginx start
Starting nginx: [ OK ]
在地址行输入检查页面是否能正常显示:http://192.168.230.10/
访问一次显示:
在访问一次显示:
4、配置/opt/modules/apache-tomcat-7.0.61/webapps/ROOT下的index.jsp文件
<%@ page language= "java" contentType= "text/html; charset=UTF-8" pageEncoding= "UTF-8" %>
SessionID:<%=session.getId()%>
<br/>
SessionIP:<%=request.getServerName()%>
<br/>
<h1>matrix1 page</h1>
4.1、重新192.168.230.10主机的tomcat服务
[root@node2 bin]# ./shutdown.sh
[root@node2 bin]# ./startup.sh
在192.168.230.11进行如下操作:
5、tomcat配置名称和session一致性配置
5.1、将jar包上传到tomcat的lib包中
5.2、在tomcat的server.xml中配置jvmRoute
进入tomcat的conf目录找到server.xml文件,并编辑
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
5.3、在context.xml的Context配置 Manager
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.230.10:11211"
sticky="false"
lockingMode="auto"
sessionBackupAsync="false"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sessionBackupTimeout="1000"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
5.4、配置/opt/modules/apache-tomcat-7.0.61/webapps/ROOT下的index.jsp文件
<%@ page language= "java" contentType= "text/html; charset=UTF-8" pageEncoding= "UTF-8" %>
SessionID:<%=session.getId()%>
<br/>
SessionIP:<%=request.getServerName()%>
<br/>
<h1>matrix2 page</h1>
5.5、重新192.168.230.11主机的tomcat服务
[root@node2 bin]# ./shutdown.sh
[root@node2 bin]# ./startup.sh
6、重新加载nginx服务
[root@node1 html]# service nginx restart
6.1、查看配置是否成功
在地址栏输入:http://www.sparsematrix.com/
刷新http://www.sparsematrix.com/地址