什么是Session分布式共享
在了解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让Http从无状态变成有状态了,页面之间传值、用户相关信息、一些不变的数据、甚至于查出来的DataTable也可以放进去,取值的时候只需要Session[Key]即可,真是方便极了,但任何事物被封为利器基本也是双刃剑,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
【web.config配置如下】
<system.web> <sessionState mode="Custom" customProvider="RedisSessionProvider"> <providers> <add name="RedisSessionProvider" type="RedisSessionProvider.RedisSessionStateStoreProvider, RedisSessionProvider"/> </providers> </sessionState> </system.web>
【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<string, StackExchange.Redis.ConfigurationOptions>( "DefaultConnection", redisConfigOpts); }; }
【存储方法】
Session["Test"] = "aa";
【调用方法】
string str = Session["Test"].ToString()
如果你配置好Redis,并且做好上面这些配置,运行如果出现以下问题,请更新RedisSessionProvider的依赖包StackExchange.Redis到最新。
3、Redis下载与安装
Redis下载:https://github.com/MSOpenTech/redis
修改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
上图为redis启动成功,默认6379,可以通过redis-cli进行测试,看别的机子能否访问。还可以在找个redis可视化工具看看里面存了啥,也可以监控Session是否持久化到Redis中了。
运行RedisSessionProvider这个项目。同一个IIS下,同域名,不同IP,同一浏览器,不同端口一个是2459,一个是2490。
不同浏览器SessionId是不同的。必须保证SessionId,测试必须是同一个浏览器进程分出的不同子标签才可以,这样SessionId是共享的。
成功了就是这样的拓扑图:
三、Ngnix的相关知识
1、Ngnix安装&下载
下载地址:http://nginx.org/
2、nginx.conf配置修改
a、接口修改
listen 80; 改成 listen 1100; 因为一般都被80都被使用。
b、增加负载均衡】
upstream Jq_one { server 127.0.0.1:8770; server 192.168.8.138:7777; } server { ..... }
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 ginx-1.0.2>start nginx或C:server ginx-1.0.2>nginx.exe
e、Nginx重新载入命令
C:server ginx-1.0.2>nginx.exe -s reload
四、Session分布式共享
1、拓扑图
通过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上面。
3、利用MachineKey进行Session分布式共享
Ip_Hash在一定程度上解决了Session分布式共享的问题,但是没有发挥出nginx均衡负载的功能,继续改进。
a、现将Ip_Hash去掉
去掉Ip_Hash重启Nginx,打开网站,点击设置Session按钮,结果报错
b、往web.config添加MachineKey
<machineKey validationKey="86B6275BA31D3D713E41388692FCA68F7D20269411345AA1C17A7386DACC9C46E7CE5F97F556F3CF0A07159659E2706B77731779D2DA4B53BC47BFFD4FD48A54" decryptionKey="9421E53E196BB56DB11B9C25197A2AD470638EFBC604AC74CD29DBBCF79D6046" validation="SHA1" decryption="AES" />
【注意】负载均衡的两个网站的MachineKey必须一样,否则出问题。
c、如下图服务器的Ip在不断变化,而Session却没有丢失,至此实现了Session分布式共享。
什么是Session分布式共享的更多相关文章
- Session分布式共享 = Session + Redis + Nginx
一.Session 1.Session 介绍 我相信,搞Web开发的对Session一定再熟悉不过了,所以我就简单的介绍一下. Session:在计算机中,尤其是在网络应用中,称为"会话控制 ...
- 详解Session分布式共享(.NET CORE版)
一.前言&回顾 在上篇文章Session分布式共享 = Session + Redis + Nginx中,好多同学留言问了我好多问题,其中印象深刻的有:nginx挂了怎么办?采用Redis的S ...
- Session分布式共享 = Session + Redis + Nginx(转)
出处:http://www.cnblogs.com/newP/p/6518918.html 一.Session 1.Session 介绍 我相信,搞Web开发的对Session一定再熟悉不过了,所以我 ...
- asp.net session分布式共享解决方案
Session共享是分布式系统设计时必须考虑的一个重要的点.相比较java中的session共享解决方案,.net中的解决方案还是比较少,MemcachedSessionProvider类库是比较优秀 ...
- netcore 使用redis session 分布式共享
首先准备redis服务器(docker 和redis3.0内置的哨兵进行高可用设置) 网站配置Redis作为存储session的介质(配置文件这些略).然后可以了解一下MachineKey这个东西.( ...
- nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...
- spring-session实现分布式集群session的共享
前言 HttpSession是通过Servlet容器创建和管理的,像Tomcat/Jetty都是保存在内存中的.但是我们把应用搭建成分布式的集群,然后利用LVS或Nginx做负载均衡,那么来自同一用户 ...
- SpringBoot,Security4, redis共享session,分布式SESSION并发控制,同账号只能登录一次
由于集成了spring session ,redis 共享session,导致SpringSecurity单节点的session并发控制失效, springSession 号称 无缝整合httpses ...
- spring-session实现分布式集群session的共享(转)
原文: https://www.cnblogs.com/youzhibing/p/7348337.html HttpSession是通过Servlet容器创建和管理的,像Tomcat/Jetty都是保 ...
随机推荐
- C#程序中判断DEBUG和RELEASE状态
编辑 删除 习惯了用老方式(注释的方式)来对程序进行调试,不过昨天才发现这样调试存在很大的隐患:在工程发布的时候如果忘记把该注释的代码注释掉,而让这些调试信息随工程一起发布,如果是可见的调试信息倒好发 ...
- Oracle中删除用户下所有对象的多种方法
Oracle删除用户下所有对象的方法未必人人都会,下面就为您介绍两种常用的Oracle删除用户下所有对象的方法,希望对您学习Oracle删除用户方面能有所帮助. 方法1: drop user XX ...
- Unity中的内存泄漏
在对内存泄漏有一个基本印象之后,我们再来看一下在特定环境——Unity下的内存泄漏.大家都知道,游戏程序由代码和资源两部分组成,Unity下的内存泄漏也主要分为代码侧的泄漏和资源侧的泄漏,当然,资源侧 ...
- 执行tsung时报"Maximum number of concurrent users in a single VM reached
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ovcer.blog.51cto.com/1145188/1581326 [roo ...
- 维京传奇第四季/全集Vikings迅雷下载
英文全名Vikings,第4季(2015). 本季看点:<维京传奇>当第四季开始时,Ragnar已经病入膏肓,随时可能丧命.毫无疑问,权力斗争异常激烈,谁都想在Ragnar死后获得最大利益 ...
- 64位Windows操作系统中的注冊表
x64系统上有x64.x86两种注冊表,记录下. 64 位Windows系统中的注冊表分为 32 位注冊表项和 64 位注冊表项.很多 32 位注冊表项与其对应的 64 位注冊表项同名. 在64位版本 ...
- WinForm自定义控件–TextBox扩展
一.简单回顾 在前两节中,对Panel和GroupBox控件进行了相关的扩展应用,主要都是设置控件的边框以及边框颜色等.本节,继续对WinForm现有的控件TextBox进行扩展,来满足实际开发中 ...
- Chapter 2 -- Preconditions
Using Guava's precondition checking utilities, explained. explained Updated Apr 23, 2012 by wasserma ...
- fromdata上传文件,ajax上传文件, 纯js上传文件,html5文件异步上传
前端代码: 上传附件(如支付凭证等) <input type="file" name="fileUpload" id="fileUpload&q ...
- SpringMVC request生命周期
When the request leaves the browser, it carries information about what the user is asking for. At ve ...