Redis实现session解决Nginx的session一致性问题

发布 : 2016-02-12 分类 : 大数据 浏览 :
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一致性解决方案

session复制

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

共享session

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

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

共享管理session。
1
怎么解决?准备两台Linux主机分别是192.168.230.10以及192.168.230.11

在192.168.230.10进行如下操作:

1.安装redis缓存数据库

1
2
3
[root@node1 ~]# yum -y install redis

如果不能使用yum进行网络安装,可以下载到Apache官网上下载redis压缩文件上传到Linux主机上进行安装

1.1.上传redis压缩文件

1.2.解压redis压缩文件

1
2
3
4
[root@node1 software]# tar -zxf redis-3.0.5.tar.gz -C /opt/modules

安装redis缓存数据库,修改配置文件vi /etc/redis.conf
bind的127.0.0.1修改为本机地址,否则只能本机

2.tomcat配置名称和session一致性配置

2.1.导入redislib中三个jar包到tomcat中

2.2.在两台Linux主机中的tomcat的conf目录中配置

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

2.4.在context.xml的Context配置 Manager

1
2
在server.xml文件中:
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />

1
2
3
4
5
6
7
在context.xml文件中:

<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="192.168.230.10"
port="6379"
database="0"
maxInactiveInterval="60" />

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
18
19
20
21
22
23
24
25
26
27
28
[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;
}


}
```

![](http://7xqkk1.com1.z0.glb.clouddn.com/16-3-2/84583251.jpg)

### 3.3.重新启动nginx服务

```bash
[root@node1 init.d]# service nginx stop
Stopping nginx: [ OK ]
[root@node1 init.d]# service nginx start
Starting nginx: [ OK ]

在地址行输入检查页面是否能正常显示:http://www.sparsematrix.com/

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
进入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/12/Redis实现session解决Nginx的session一致性问题/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

知识 & 情怀 | 二者兼得

微信扫一扫, 向我投食

微信扫一扫, 向我投食

支付宝扫一扫, 向我投食

支付宝扫一扫, 向我投食

留下足迹