解决网站在负载均衡环境下SESSION丢失的问题
生活随笔
收集整理的這篇文章主要介紹了
解决网站在负载均衡环境下SESSION丢失的问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在WEB場中,動態(tài)網(wǎng)頁往往會因為幾臺主機(jī)做了負(fù)載而產(chǎn)生SESSION丟失的問題,網(wǎng)上也有很多的介紹,我這里只將我經(jīng)歷的過程給大家分享一下:
系統(tǒng)要運(yùn)行在負(fù)載平衡的 Web 場環(huán)境中,而系統(tǒng)配置文件web.config中的Session狀態(tài)卻設(shè)置為InProc(即在本地存儲會話狀態(tài)),導(dǎo)至在用戶訪問量大時,Session常經(jīng)超時的情況。引起這個現(xiàn)象的原因主要是因為用戶通過負(fù)載平衡IP來訪問WEB應(yīng)用系統(tǒng),某段時候在某臺服務(wù)器保存了Session 的會話狀態(tài),但在其它的WEB前端服務(wù)器中卻沒有保存Session的會話狀態(tài),而隨著并發(fā)量的增大,負(fù)載平衡會當(dāng)作路由隨時訪問空閑的服務(wù)器,結(jié)果空閑的服務(wù)器并沒有之前保存的Session會話狀態(tài)。 解決辦法: 1.當(dāng)您在負(fù)載平衡的 Web 場環(huán)境中運(yùn)行 ASP.NET Web 應(yīng)用程序時,一定要使用 SqlServer 或 StateServer 會話狀態(tài)模式,在項目中我們基于性能考慮并沒有選擇SqlServer模式來存儲Session狀態(tài),而是選擇一臺SessionStateServer 服務(wù)器來用戶的Session會話狀態(tài)。我們要在系統(tǒng)配置文件web.config中設(shè)置如下: <sessionState mode="StateServer" cookieless="false" timeout="240" stateConnectionString="tcpip=192.168.0.1:42424" stateNetworkTimeout="14400" /> 這里的紅字體的IP一定要是同域的一臺機(jī)器,在這臺機(jī)器上進(jìn)行第二步的操作,同時將其注冊表中HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servi ces\aspnet_state\Parameter s\AllowRemoteConnection的鍵值改為1,然后重啟本機(jī)的ASP.NET State Service服務(wù) 還要添加一項 <machineKey validationKey="78AE3850338BFADCE59D8DDF58C9E4518E7510149C46142D7AAD7F1AD49D95D4" decryptionKey="5FC88DFC24EA123C" validation="SHA1"/> 如何生成machineKey? 按照MSDN的標(biāo)準(zhǔn)說法:“對密鑰進(jìn)行配置,以便將其用于對 Forms 身份驗證 Cookie 數(shù)據(jù)和視圖狀態(tài)數(shù)據(jù)進(jìn)行加密和解密,并將其用于對進(jìn)程外會話狀態(tài)標(biāo)識進(jìn)行驗證?!币簿褪钦fAsp.Net的很多加密,都是依賴于machineKey里面的值,例如Forms 身份驗證 Cookie、ViewState的加密。默認(rèn)情況下,Asp.Net的配置是自己動態(tài)生成,如果單臺服務(wù)器當(dāng)然沒問題,但是如果多臺服務(wù)器負(fù)載均衡,machineKey還采用動態(tài)生成的方式,每臺服務(wù)器上的machinekey值不一致,就導(dǎo)致加密出來的結(jié)果也不一致,不能共享驗證和ViewState,所以對于多臺服務(wù)器負(fù)載均衡的情況,一定要在每臺站點配置相同的machineKey。 machineKey生成的算法:| 1 2 3 4 5 6 7 8 9 10 11 12 13 | validationKey?=?CreateKey(20); decryptionKey?=?CreateKey(24); protected?string?CreateKey(int?len) { byte[]?bytes?=?new?byte[len]; new?RNGCryptoServiceProvider().GetBytes(bytes); StringBuilder?sb?=?new?StringBuilder(); for(int?i?=?0;?i?<?bytes.Length;?i++) { sb.Append(string.Format("{0:X2}",bytes[i])); } return?sb.ToString(); } |
| 1 2 3 4 5 6 7 | <?xml?version="1.0"?> <configuration> <system.web> <machineKey?validationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8"? decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77"?decryption="3DES"?validation="SHA1"/> </system.web> </configuration> |
總結(jié)
以上是生活随笔為你收集整理的解决网站在负载均衡环境下SESSION丢失的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 存储过程中执行动态Sql语句
- 下一篇: 印度的种族制度是由什么来制定的?