🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# Nginx 的session一致性问题 http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你。那么,在一些场合,确实需要服务器记住当前用户怎么办?比如用户登录邮箱后,接下来要收邮件、写邮件,总不能每次操作都让用户输入用户名和密码吧,为了解决这个问题,session的方案就被提了出来,事实上它并不是什么新技术,而且也不能脱离http协议以及任何现有的web技术。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 **这里以共享session的方法来探讨session一至性的问题。** - 1、在192.168.0.19节点安装memcache ``` yum -y install memcached systemctl start memcached systemctl enable memcached ``` - 2、web服务器连接memcached的jar包拷贝到tomcat的lib(`/opt/apache-tomcat-7.0.61/lib`),相关资源下载[请点击这里](https://pan.baidu.com/s/1m6FNp7mmHrluGACslH3-Tg) - 3、修改server.xml里面修改Engine标签,添加jvmRoute属性,目的是查看sessionid里面带有tomcat的名字,就是这里配置的jvmRoute ``` vi /opt/apache-tomcat-7.0.61/conf/server.xml ``` ![3-2-16](http://pded8ke3e.bkt.clouddn.com/3-2-16.png) - 4、配置tomcat的conf目录下的context.xml ``` vi /opt/apache-tomcat-7.0.61/conf/context.xml ``` ![3-2-17](http://pded8ke3e.bkt.clouddn.com/3-2-17.png) 配置memcachedNodes属性,配置memcached数据库的ip和端口,默认11211,多个的话用空格隔开.目的是让tomcat服务器从memcached缓存里面拿session或者是放session - 5、修改index.jsp,取sessionid看一看 ![3-2-18](http://pded8ke3e.bkt.clouddn.com/3-2-18.png) 重启tomact ``` sh /opt/apache-tomcat-7.0.61/bin/shutdown.sh sh /opt/apache-tomcat-7.0.61/bin/startup.sh ``` - 6、在另外一个节点重复2-5的步骤 - 7、验证 ![3-2-19](http://pded8ke3e.bkt.clouddn.com/3-2-19.png) ![3-2-20](http://pded8ke3e.bkt.clouddn.com/3-2-20.png)