在了解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分布式共享相关推荐

  1. Session分布式共享 = Session + Redis + Nginx

    一.Session 1.Session 介绍 我相信,搞Web开发的对Session一定再熟悉不过了,所以我就简单的介绍一下. Session:在计算机中,尤其是在网络应用中,称为"会话控制 ...

  2. 详解Session分布式共享(.NET CORE版)

    一.前言&回顾 在上篇文章Session分布式共享 = Session + Redis + Nginx中,好多同学留言问了我好多问题,其中印象深刻的有:nginx挂了怎么办?采用Redis的S ...

  3. 基于shiro实现session持久化和分布式共享

    前言 本文写下session持久化和分布式共享 基于shiro框架对session的管理机制来实现 必要性 一直处于登陆状态:你登陆微信 不可能三天两头就让你重新登陆吧?而是一直处于登陆状态 除非主动 ...

  4. 服务器集群环境下session的共享问题

    一,集群和分布式的区别 在进入今天的正题之前,对服务器集群和分布式服务器这两个概念进行简要说明. 服务器集群:服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一个服务器. ...

  5. 通过memcached来实现对tomcat集群中Session的共享策略 .

    近期在做一套集群的实现,实现的方案是在Linux下完成对Apache + Tomcat 负载均衡的功能. 但是实现了该集群后,发现登陆系统后,每次都会被拦截回登录页面,造成该现象的原因是Session ...

  6. java cookie共享_JavaWeb的session及其共享技术

    原标题:JavaWeb的session及其共享技术 1.什么叫会话 一次会话指的是:就好比打电话,A给B打电话,接通之后,会话开始,直到挂断电话,该次会话就结束了,而浏览器访问服务器,就跟打电话一样, ...

  7. 在动态网络下实现分布式共享存储

    摘要:本文介绍了分布式环境下实现共享内存模型会遇到的各种问题和挑战,并针对不同问题介绍多种算法的优劣性.本文是对现阶段该领域研究现状的总体介绍,通过本文能了解动态分布式共享内存研究的前沿状况.挑战与机 ...

  8. 6.分布式共享内存(DSM - Distributed Shared Memory)

    传统上,分布式计算基于消息传递模型,其中数据以消息的形式从处理器传递到处理器.RPC 实际上是相同的模型(或非常接近). DSM 是分布式系统的所有节点(处理器)共享的虚拟地址空间.程序访问 DSM ...

  9. 如何让ie的session不共享,如每打开一个新ie窗体都是单独的session,用于单计算机登陆不用账号

    在通常情况下,我们在电脑中打开浏览器只能登录一个网站的账号,如果再新打开一个窗口,一般会显示是登录后看最后登陆的页面账号,因为Session是共享的,会覆盖之前账号,最后登陆有效. 因此我们有些时候需 ...

最新文章

  1. centos7 下搭建git服务器
  2. 浅谈Java throw, throws, try catch异常处理
  3. 极大似然估计_计量经济学 | 极大似然估计
  4. i7 5500u linux,i7 5500u相当于什么cpu
  5. C++工作笔记-作用域的巧妙使用,释放堆区创建的资源
  6. Vue的使用技巧是什么,学习难度怎么样?
  7. matlab如何看算法时间,【Matlab实现】动态时间规划调整算法(DTW算法)——计算两个序...
  8. WinDbg分析蓝屏dump原因
  9. Thinkpad T410i-2516A21 安装Ubuntu10.0.4记录
  10. 青藏高原的气候类型及气候特征
  11. 浏览器-IE主页被篡改后修复
  12. Python爬虫之实习僧招聘信息及数据分析
  13. 数字化觉醒时代:传统企业云原生技术体系建设之路(一)
  14. 2345浏览器如何启用过滤弹窗广告
  15. 在WPF里使用指纹认证(一、安装SDK)
  16. 【渝粤题库】陕西师范大学180204市场营销学 作业(高起本)
  17. stata F值缺失_Stata数据处理: 面板数据填充和补漏
  18. 编译 文件 libboost_log-vc120-mt-sgd-1_59.lib
  19. shell 字体颜色代码
  20. Fundamentals of Computer Graphics, Fourth Edition 中文翻译

热门文章

  1. 开机故障中的MBR引导故障的排查
  2. 处理Img标签中src无效时出现的border
  3. CRM数据如何让企业未卜先知
  4. 运营商市场定位决定移动互联网的成败
  5. nginx+tomcat 反向代理 负载均衡配置
  6. 窗口和元素的大小:offset client scroll
  7. php 斗鱼人数,斗鱼旭旭宝宝再度登顶指数榜首位 单日弹幕人数高达48万人
  8. springboot日志处理
  9. DelayExchange原理
  10. synchronized的用法