什么是Session分布式共享

作者 : 开心源码 本文共3419个字,预计阅读时间需要9分钟 发布时间: 2022-05-11 共62人阅读

在理解session分布式共享之前先来理解Session、Redis和Nginx的相关知识。

一、Session相关知识

1、Session 详情

Session在网络应使用中,称为“会话控制”。 每个使用户(浏览器)初次与web服务器建立连接时,就会产生一个Session,同时服务器会分配一个SessionId给使用户的浏览器。我们能使用Fiddler查看cookies中,会看到有一个SessionId的cookie,大家都知道Http是无状态请求,但是Session仿佛又让Http请求变得有状态,其核心就在于这个叫SessionId的cookie,这个相当于数据库的Key,服务器那边再有个Session内容缓存表,是不是Session的内容就很容易得到了。

什么是Session分布式共享

刚接触程序开发的人肯定爱死Session了,由于Session让Http从无状态变成有状态了,页面之间传值、使用户相关信息、少量不变的数据、甚至于查出来的DataTable也能放进去,取值的时候只要要Session[Key]就可,真是方便极了,但任何事物被封为利器基本也是双刃剑,Session的许多问题我们不得不去面对。

什么是Session分布式共享

这个问题很多人都遇到过,Session是导致这个起因之一,Session丢了让使用户重新登录,处理方案为是把Session时间调到9999,结果该发生的还是继续发生着,Session照样丢失。

2、常见Session丢失起因

  • Session超时,使用户打开页面,页面长时间不操作会导致此起因

  • IIS应使用程序池回收,或者者重启

  • Web.Config修改,即IIS应使用程序池重启

  • dll被替换或者者动态页面修改,即IIS应使用程序池重启

  • 杀毒软件对.config文件进行扫描,可可以会导致IIS应使用程序池回收

  • 使用户浏览器禁使用cookie

  • 其余起因

为什么说其余起因呢,好多程序员无法查明是什么起因导致Session丢失,但Session丢失我归结为两大类,一个是数据的Key丢了,一个是Session内容数据库的丢了,使用户浏览器禁使用cookie肯定是Key没了。IIS应使用程序池回收必定会导致Session的内容缓存表丢失。

3、处理Session丢失的方法

处理过Session丢失的都会使用到这几种方法:

  • InProc:将Session存到进程内。

  • StateServer:将Session存到独立的状态服务中(Asp.Net State Service)。

  • SqlServer:将Session存到SqlServer中。

  • Cookieless:设置用户端Session存储的方式。

二、Redis相关知识

1、Redis详情

Redis是一个开源的用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。开发人员使用它处理了丢失问题,后来发现它还能实现Session分布式共享,Session丢失、以及持久化到SqlServer数据的性可以问题也随之处理。

2、RedisSessionProvider

首先通过nuget下载 RedisSessionProvider

什么是Session分布式共享

【web.config配置如下】

           

【Global.asax】

void Application_Start(object sender, EventArgs e)  {  StackExchange.Redis.ConfigurationOptions redisConfigOpts = StackExchange.Redis.ConfigurationOptions.Parse("192.168.8.138:6379");  RedisSessionProvider.Config.RedisConnectionConfig.GetSERedisServerConfig = (HttpContextBase context) =>  {  return new KeyValuePair(  "DefaultConnection",  redisConfigOpts);  };  }

【存储方法】

Session["Test"] = "aa";

【调使用方法】

string str = Session["Test"].ToString()

假如你配置好Redis,并且做好上面这些配置,运行假如出现以下问题,请升级RedisSessionProvider的依赖包StackExchange.Redis到最新。

什么是Session分布式共享

3、Redis下载与安装

Redis下载:https://github.com/MSOpenTech/redis

什么是Session分布式共享

  • 修改Redis.windows.conf,假如不修改,远程不可以访问Redis

  • 将bind 127.0.0.1 改成了bind 0.0.0.0。注意:进入生产环境时候,要启使用密码,否则会是Redis漏洞,具体请自行百度

  • protected-mode yes 改成 protected-mode no

  • 详细修改的传送门: redis开启远程访问

redis-server redis.windows.conf

什么是Session分布式共享

上图为redis启动成功,默认6379,能通过redis-cli进行测试,看别的机子可以否访问。还能在找个redis可视化工具看看里面存了啥,也能监控Session能否持久化到Redis中了。

运行RedisSessionProvider这个项目。同一个IIS下,同域名,不同IP,同一浏览器,不同端口一个是2459,一个是2490。

什么是Session分布式共享

不同浏览器SessionId是不同的。必需保证SessionId,测试必需是同一个浏览器进程分出的不同子标签才能,这样SessionId是共享的。

什么是Session分布式共享

成功了就是这样的拓扑图:

什么是Session分布式共享

三、Ngnix的相关知识

1、Ngnix安装&下载

下载地址:http://nginx.org/

2、nginx.conf配置修改

什么是Session分布式共享

a、接口修改

listen 80; 改成 listen 1100; 由于一般都被80都被用。

什么是Session分布式共享

b、添加负载均衡】

upstream Jq_one {  server 127.0.0.1:8770;  server 192.168.8.138:7777; } server { ..... }

什么是Session分布式共享

c、location节点修改

location / {  root html;  index index.aspx index.html index.htm;  #其中jq_one 对应着upstream设置的集群名称  proxy_pass http://Jq_one;  #设置主机头和用户端真实地址,以便服务器获取用户端真实IP  proxy_set_header Host $host;  proxy_set_header X-Real-IP $remote_addr;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  }

d、Nginx启动命令

C:\server\nginx-1.0.2>start nginx或者C:\server\nginx-1.0.2>nginx.exe

e、Nginx重新载入命令

C:\server\nginx-1.0.2>nginx.exe -s reload

四、Session分布式共享

1、拓扑图

什么是Session分布式共享

通过Nginx+Redis实现对Session的分布式共享功可以有二种方式:

2、利使用Nginx的Ip_Hash进行Session分布式共享

用nginx将同一ip的请求分配到固定服务器,修改如下。ip_hash会计算ip对应hash值,而后分配到固定服务器

upstream Jq_one{  server 127.0.0.1:8770;  server 192.168.8.138:7777;    ip_hash; }

效果能了解为就是一个Ip,通过Nginx路由到IIS_1上面,在屡次请求,会一直在IIS_1上,不会路由到IIS_2上面。

什么是Session分布式共享

3、利使用MachineKey进行Session分布式共享

Ip_Hash在肯定程度上处理了Session分布式共享的问题,但是没有发挥出nginx均衡负载的功可以,继续改进。

a、现将Ip_Hash去掉

去掉Ip_Hash重启Nginx,打开网站,点击设置Session按钮,结果报错

什么是Session分布式共享

b、往web.config增加MachineKey

【注意】负载均衡的两个网站的MachineKey必需一样,否则出问题。

c、如下图服务器的Ip在不断变化,而Session却没有丢失,至此实现了Session分布式共享。

什么是Session分布式共享

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 什么是Session分布式共享

发表回复