Nginx的session一致性问题

发布 : 2016-02-22 分类 : 大数据 浏览 :
1
2
3
4
5
6
7
http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,
因为它记不住你。

那么,在一些场合,确实需要服务器记住当前用户怎么办?
比如用户登录邮箱后,接下来要收邮件.写邮件,总不能每次操作都让用户输入用户名和密码吧,
为了解决这个问题,session的方案就被提了出来,
事实上它并不是什么新技术,而且也不能脱离http协议以及任何现有的web技术

关于Session:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
session的常见实现形式是会话cookie(session cookie),

即未设置过期时间的cookie,

这个cookie的默认生命周期为浏览器会话期间,

只要关闭浏览器窗口,cookie就消失了。

实现机制是当用户发起一个请求的时候,

服务器会检查该请求中是否包含sessionid,如果未包含,

则系统会创造一个名为JSESSIONID的输出 cookie返回给浏览器(只放入内存,并不存在硬盘中),

并将其以HashTable的形式写到服务器的内存里面;

当已经包含sessionid时,服务端会检查找到与该session相匹配的信息,

如果存在则直接使用该sessionid,

若不存在则重新生成新的session。

这里需要注意的是session始终是有服务端创建的,并非浏览器自己生成的。

但是浏览器的cookie被禁止后session就需要用get方法的URL重写的机制

或使用POST方法提交隐藏表单的形式来实现

Session共享

1
2
3
4
5
6
7
8
9
10
11
首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,

那么是不存在这个问题的,因为会话数据就在这台机器,

但是如果你使用了负载均衡把请求分发到不同的机器呢?

这个时候会话id在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,

而它的session数据可能存在其中一台机器,

这个时候就会出现取不到session数据的情况,于是session的共享就成了一个问题

Session一致性解决方案

1.session复制

1
tomcat 本身带有复制session的功能。(不选择这种方案)

2.共享session

1
2
3
4
5
6
7
需要专门管理session的软件,

memcached 缓存服务,可以和tomcat整合,帮助tomcat

共享管理session。

怎么解决?准备两台Linux主机分别是192.168.230.10以及192.168.230.11

在192.168.230.10进行如下操作:

1.安装memcached缓存数据库

1
2
3
4
[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

1
2
3
进入tomcat的conf目录找到server.xml文件,并编辑

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

2.4.在context.xml的Context配置 Manager

1
2
3
4
5
6
7
8
9
<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负载均衡

1
因为session一致性问题是在nginx负载均衡下出现的

3.1.进入tengine的conf目录

1
[root@node1 ~]# cd /opt/modules/tengine-2.1.0/conf

3.2.编辑nginx.conf文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[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服务

1
2
3
4
[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/

1
访问一次显示:

1
在访问一次显示:

4.配置/opt/modules/apache-tomcat-7.0.61/webapps/ROOT下的index.jsp文件

1
2
3
4
5
6
<%@ 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服务

1
2
[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

1
2
3
进入tomcat的conf目录找到server.xml文件,并编辑

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">

5.3.在context.xml的Context配置 Manager

1
2
3
4
5
6
7
8
9
<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文件

1
2
3
4
5
6
<%@ 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服务

1
2
[root@node2 bin]# ./shutdown.sh
[root@node2 bin]# ./startup.sh

6.重新加载nginx服务

1
[root@node1 html]# service nginx restart

6.1.查看配置是否成功

1
在地址栏输入:http://www.sparsematrix.com/

1
刷新http://www.sparsematrix.com/地址

本文作者 : Matrix
原文链接 : https://matrixsparse.github.io/2016/02/22/Nginx的session一致性问题/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

知识 & 情怀 | 二者兼得

微信扫一扫, 向我投食

微信扫一扫, 向我投食

支付宝扫一扫, 向我投食

支付宝扫一扫, 向我投食

留下足迹