Nginx的session一致性问题

来源:互联网 发布:电脑绘画 知乎 编辑:程序博客网 时间:2024/05/16 02:36

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 stopStopping nginx:                                            [  OK  ][root@node1 init.d]# service nginx startStarting 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/地址

2 0