轻量级web服务器nginx学习(7)———nginx实现 sticky粘滞 && session数据共享

探讨HTTP无状态问题,介绍Cookie与Session原理及其在Web开发中的应用,包括粘滞会话的实现与Session共享机制,提升用户体验并确保数据安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.sticky粘滞的实现

1.1 实验基础:
http是无状态的,所谓无状态即也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户;这对用户的体验是极差的,作为一个用户,当然想要每次访问某些网页时,将上次使用的数据保存以便用户本次访问需求(比如说:我们在连接校园网时,通常连接会跳出登录认证页面,我们登录验证时,会有记住密码的选项,当我们选择记住密码之后,等到我们下次再连接校园网时,我们所填写的登录认证信息还在,对我们来说就是一种方便。)cookie和session的就可解决http无状态的问题。

什么是cooike?
cookie——储存在用户本地终端上的数据 第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储一些小量的数据。 有一些网络用户,甚至包括一些资深的 Web 专家也对它的产生和推广感到不满,这并不是因为 Cookie 技术的功能太弱或其他技术性能上的原因,而是因为 Cookie 的使用对网络用户的隐私构成了危害
什么是session?
称为“会话控制” session和cookie的作用有点类似,都是为了存储用户相关的信息。 不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的。 Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在Session对象中

cookie和session结合使用(后续实验也是基于二者结合使用)

web开发发展至今,cookie和session的使用已经出现了一些非常成熟的方案。在如今的市场或者企业里,通过 Cookie 和 Session 技术来实现记录访问者的一些基本信息;一般有两种存储方式:
(1)存储在服务端:通过cookie存储一个session_id,然后具体的数据则是保存在session中。如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做server side session。
(2)将session数据加密,然后存储在cookie中。这种专业术语叫做client side session。flask采用的就是这种方式,但是也可以替换成其他形式

1.2 nginx中的sticky(粘滞)模块:

nginx-1.14以上的版本都不支持sticky,所以需要使用nginx-1.10版本,可以将之前实验的nginx mv移动到其他目录下保存,对1.10版本的nginx重新编译

实现效果:使用户在不关闭浏览器的情况下不同时间访问同一网页,所访问到的服务器是同一台服务器,且之前访问留下的数据依旧保存。

实现步骤
(1) 编译安装ngin-1.10

./configure --prefix=/usr/local/lnmp/nginx   --with-http_ssl_module(加密模块) --with-http_stub_status_module (监控)--with-threads --with-file-aio --add-module=/usr/local/nginx-sticky-module-ng(第三方模块)
在编译过程中可能会遇到很多需要安装的包,不用担心,需要什么就给他安装什么 知道编译完成
make && make install  ##编译安装
ln -s /usr/local/lnmp/nginx/sbin/nginx /sbin/  ##编译好之后创建快捷方式,将nginx添加到环境变量中去

在这里插入图片描述
编译中需要第三方模块,如未安装会报错:
在这里插入图片描述
安装第三方模块:
在这里插入图片描述
编译完成:
在这里插入图片描述
(2)配置nginx配置文件

vim /usr/local/lnmp/nginx/conf/nginx.conf
upstream tomcat {
        sticky;
        server 172.25.0.1:8080;
        server 172.25.0.2:8080;

}
gzip  on; #开启gzip 显示图像更快
location / {
            root   /usr/local/tomcat/webapps/ROOT;
            index  index.html index.htm;
        }
       location ~ \.jsp$ {
           proxy_pass   http://tomcat;
       }

(3)重启服务

nginx #重启nginx

测试:在浏览器中访问http://172.25.254.111/test.jsp 不断刷新网页,网页id不发生变化,sticky粘滞实现
在这里插入图片描述
但将浏览器关闭后,浏览器中缓存消失,sticky会失效:
在这里插入图片描述

2.session共享

需求:
nginx中的sticky模块已然提高了用户体验度,但在服务器运作过程中不可能不出现问题,假设当我们在访问一个网页时,所访问的服务器突然崩溃了!那作为企业人员,我们该怎么做,来保证用户的数据信息依旧保存呢?

实现效果:
这就要借助到memcache模块了。利用memcached缓存存储,与服务器存储 实现交叉存储也就是说,假设有两台服务器A与B,服务器A得到的用户数据存储服务器B的缓存存储中;服务器B得到的用户数据存储在服务器A的缓存存储之中;当无论A,B两个放服务器挂机时(一般不会有两个服务器都挂机的情况),用户都可以访问到另一台服务器的缓存,来获取自己的数据,这样的方式保证了信息的存储。交叉存储需要用的XML来进行数据存储与传输

什么是XML?

xml常用于数据存储和传输,文件后缀为 .xml。它是可扩展标记语言(Extensible Markup Language,简称XML),是一种标记语言标记,指计算机所能理解的信息符号; 通过此种标记,计算机之间可以处理包含各种信息的文章等
(1) 标记,指计算机所能理解的信息符号;
(2)通过此种标记,计算机之间可以处理包含各种信息的文章等。
XML设计用来传送及携带数据信息,不用来表现或展示数据,所以XML用途的焦点是它说明数据是什么,以及携带数据信息。而HTML语言则用来表现数据

实验步骤:

(在两台服务器上都配置)
cd  /usr/local/tomcat/lib 
将以下jar包拷贝到该目录:##jar中是关于mamcache的包
asm-3.2.jar
kryo-1.04.jar
kryo-serializers-0.10.jar
memcached-session-manager-1.6.3.jar
memcached-session-manager-tc7-1.6.3.jar(最重要)
minlog-1.2.jar
msm-kryo-serializer-1.6.3.jar
reflectasm-1.01.jar
spymemcached-2.7.3.jar
  

vim   /usr/local/tomcat/conf/context.xml ##加入session共享配置,context.xml 该文件的作用是配置各种数据库的连接池
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.230.5:11211,n2:172.25.230.6:11211"
failoverNodes="n1" (在172.25.230.6上"n1"改为"n2")
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>

yum install -y memcached ##安装memcache的守护进程 ,两台服务器都需要
systeemctl start memcached ##启动服务

cd /usr/local/tomcat/
sbin/shutdowm.sh ##重启tomcat
sbin/startup.sh

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

测试:
在浏览器中访问http://172.25.254.111/test.jsp 输入数据,在另一服务器查看缓存中是否有保存的数据
telnet localhost 11211 telent详解
get [id号]
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
(1)停止某一方服务器,模拟挂机,刷新网页,用户数据还在,但访问的服务器发生了变化
在这里插入图片描述
在这里插入图片描述
(2)模拟缓存挂机,发现存储缓存位置变为另一主机缓存。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值