在了解session分布式共享之前先來(lái)了解Session,、Redis和Nginx的相關(guān)知識(shí),。一、Session相關(guān)知識(shí) 1,、Session 介紹 Session在網(wǎng)絡(luò)應(yīng)用中,,稱為“會(huì)話控制”。 每個(gè)用戶(瀏覽器)首次與web服務(wù)器建立連接時(shí),,就會(huì)產(chǎn)生一個(gè)Session,,同時(shí)服務(wù)器會(huì)分配一個(gè)SessionId給用戶的瀏覽器。我們可以用Fiddler查看cookies中,,會(huì)看到有一個(gè)SessionId的cookie,,大家都知道Http是無(wú)狀態(tài)請(qǐng)求,但是Session仿佛又讓Http請(qǐng)求變得有狀態(tài),,其核心就在于這個(gè)叫SessionId的cookie,,這個(gè)相當(dāng)于數(shù)據(jù)庫(kù)的Key,服務(wù)器那邊再有個(gè)Session內(nèi)容緩存表,,是不是Session的內(nèi)容就很容易得到了,。 剛接觸程序開(kāi)發(fā)的人一定愛(ài)死Session了,因?yàn)镾ession讓Http從無(wú)狀態(tài)變成有狀態(tài)了,,頁(yè)面之間傳值,、用戶相關(guān)信息、一些不變的數(shù)據(jù),、甚至于查出來(lái)的DataTable也可以放進(jìn)去,,取值的時(shí)候只需要Session[Key]即可,真是方便極了,,但任何事物被封為利器基本也是雙刃劍,,Session的許多問(wèn)題我們不得不去面對(duì),。 這個(gè)問(wèn)題很多人都遇到過(guò),Session是導(dǎo)致這個(gè)原因之一,,Session丟了讓用戶重新登錄,,解決方案為是把Session時(shí)間調(diào)到9999,結(jié)果該發(fā)生的還是繼續(xù)發(fā)生著,,Session照樣丟失,。 2、常見(jiàn)Session丟失原因
為什么說(shuō)其他原因呢,,好多程序員無(wú)法查明是什么原因?qū)е耂ession丟失,,但Session丟失我歸結(jié)為兩大類,一個(gè)是數(shù)據(jù)的Key丟了,,一個(gè)是Session內(nèi)容數(shù)據(jù)庫(kù)的丟了,,用戶瀏覽器禁用cookie一定是Key沒(méi)了。IIS應(yīng)用程序池回收必定會(huì)導(dǎo)致Session的內(nèi)容緩存表丟失,。 3,、解決Session丟失的方法 解決過(guò)Session丟失的都會(huì)用到這幾種方法:
二,、Redis相關(guān)知識(shí) 1,、Redis介紹 Redis是一個(gè)開(kāi)源的使用ANSI C語(yǔ)言編寫(xiě)、支持網(wǎng)絡(luò),、可基于內(nèi)存亦可持久化的日志型,、Key-Value數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的API,。開(kāi)發(fā)人員用它解決了丟失問(wèn)題,,后來(lái)發(fā)現(xiàn)它還可以實(shí)現(xiàn)Session分布式共享,Session丟失,、以及持久化到SqlServer數(shù)據(jù)的性能問(wèn)題也隨之解決,。 2、RedisSessionProvider 首先通過(guò)nuget下載 RedisSessionProvider 【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 【存儲(chǔ)方法】 Session['Test'] = 'aa'; 【調(diào)用方法】 string str = Session['Test'].ToString() 如果你配置好Redis,,并且做好上面這些配置,,運(yùn)行如果出現(xiàn)以下問(wèn)題,,請(qǐng)更新RedisSessionProvider的依賴包StackExchange.Redis到最新。 3,、Redis下載與安裝 Redis下載:https://github.com/MSOpenTech/redis
redis-server redis.windows.conf 上圖為redis啟動(dòng)成功,默認(rèn)6379,,可以通過(guò)redis-cli進(jìn)行測(cè)試,,看別的機(jī)子能否訪問(wèn)。還可以在找個(gè)redis可視化工具看看里面存了啥,,也可以監(jiān)控Session是否持久化到Redis中了,。 運(yùn)行RedisSessionProvider這個(gè)項(xiàng)目。同一個(gè)IIS下,,同域名,,不同IP,同一瀏覽器,,不同端口一個(gè)是2459,,一個(gè)是2490。 不同瀏覽器SessionId是不同的,。必須保證SessionId,,測(cè)試必須是同一個(gè)瀏覽器進(jìn)程分出的不同子標(biāo)簽才可以,這樣SessionId是共享的,。 成功了就是這樣的拓?fù)鋱D: 三,、Ngnix的相關(guān)知識(shí) 1、Ngnix安裝&下載 下載地址:http:/// 2,、nginx.conf配置修改 a,、接口修改 listen 80; 改成 listen 1100; 因?yàn)橐话愣急?0都被使用。 b,、增加負(fù)載均衡】 upstream Jq_one { server 127.0.0.1:8770; server 192.168.8.138:7777; } server { ..... } c,、location節(jié)點(diǎn)修改 location / { root html; index index.aspx index.html index.htm; #其中jq_one 對(duì)應(yīng)著upstream設(shè)置的集群名稱 proxy_pass http://Jq_one; #設(shè)置主機(jī)頭和客戶端真實(shí)地址,以便服務(wù)器獲取客戶端真實(shí)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啟動(dòng)命令 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,、拓?fù)鋱D 通過(guò)Nginx+Redis實(shí)現(xiàn)對(duì)Session的分布式共享功能有二種方式: 2,、利用Nginx的Ip_Hash進(jìn)行Session分布式共享 使用nginx將同一ip的請(qǐng)求分配到固定服務(wù)器,,修改如下。ip_hash會(huì)計(jì)算ip對(duì)應(yīng)hash值,,然后分配到固定服務(wù)器 upstream Jq_one{ server 127.0.0.1:8770; server 192.168.8.138:7777; ip_hash; } 效果可以理解為就是一個(gè)Ip,,通過(guò)Nginx路由到IIS_1上面,在多次請(qǐng)求,,會(huì)一直在IIS_1上,,不會(huì)路由到IIS_2上面。 3,、利用MachineKey進(jìn)行Session分布式共享 Ip_Hash在一定程度上解決了Session分布式共享的問(wèn)題,,但是沒(méi)有發(fā)揮出nginx均衡負(fù)載的功能,繼續(xù)改進(jìn),。 a,、現(xiàn)將Ip_Hash去掉 去掉Ip_Hash重啟Nginx,打開(kāi)網(wǎng)站,,點(diǎn)擊設(shè)置Session按鈕,,結(jié)果報(bào)錯(cuò) b、往web.config添加MachineKey 【注意】負(fù)載均衡的兩個(gè)網(wǎng)站的MachineKey必須一樣,,否則出問(wèn)題,。 c、如下圖服務(wù)器的Ip在不斷變化,,而Session卻沒(méi)有丟失,,至此實(shí)現(xiàn)了Session分布式共享。 |
|
來(lái)自: 昵稱11935121 > 《未命名》