溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

負(fù)載均衡時(shí)Session共享的問(wèn)題應(yīng)該怎么樣解決

發(fā)布時(shí)間:2020-04-16 11:50:03 來(lái)源:億速云 閱讀:464 作者:三月 欄目:系統(tǒng)運(yùn)維

下文給大家?guī)?lái)負(fù)載均衡時(shí)Session共享的問(wèn)題應(yīng)該怎么樣解決,希望能夠給大家在實(shí)際運(yùn)用中帶來(lái)一定的幫助,負(fù)載均衡涉及的東西比較多,理論也不多,網(wǎng)上有很多書(shū)籍,今天我們就用億速云在行業(yè)內(nèi)累計(jì)的經(jīng)驗(yàn)來(lái)做一個(gè)解答。

每個(gè)客戶端在訪問(wèn)網(wǎng)站時(shí),都會(huì)創(chuàng)建相應(yīng)的Session,用來(lái)保存客戶的狀態(tài)信息,網(wǎng)站如果做了負(fù)載均衡,session共享是要做的,IIS對(duì)于session的存儲(chǔ)有五種模式

負(fù)載均衡時(shí)Session共享的問(wèn)題應(yīng)該怎么樣解決

一、ASP.Net session存儲(chǔ)方式

1、InProc模式(進(jìn)程內(nèi)模式) 。為默認(rèn)設(shè)置。

會(huì)話狀態(tài)存儲(chǔ)在Web云服務(wù)器上的內(nèi)存中。

2、StateServer模式(狀態(tài)服務(wù)器模式)。

會(huì)話狀態(tài)存儲(chǔ)在一個(gè)名為ASP.Net狀態(tài)服務(wù)的單獨(dú)進(jìn)程中。這確保了在重新啟動(dòng)Web應(yīng)用程序時(shí)會(huì)保留會(huì)話狀態(tài),并讓會(huì)話狀態(tài)可用于網(wǎng)路場(chǎng)中的多個(gè)Web服務(wù)器。

3、SQL Server模式。

會(huì)話狀態(tài)存儲(chǔ)到一個(gè)SQL Server數(shù)據(jù)庫(kù)中。這確保了在重新啟動(dòng)Web應(yīng)用程序時(shí)會(huì)保留會(huì)話狀態(tài),并讓會(huì)話狀態(tài)可用于網(wǎng)路場(chǎng)中的多個(gè)Web服務(wù)器。

4、Custom模式

此模式允許您指定自定義存儲(chǔ)提供程序。

5、Off模式

此模式禁止會(huì)話狀態(tài)。


二、使用StateServer存儲(chǔ)session

      如果網(wǎng)站做了負(fù)載均衡,對(duì)于session存儲(chǔ)就只能選擇2、3、4了,下面先來(lái)介紹一下StateServer模式,首先得開(kāi)啟狀態(tài)服務(wù)

負(fù)載均衡時(shí)Session共享的問(wèn)題應(yīng)該怎么樣解決

然后再對(duì)web站點(diǎn)的“會(huì)話狀態(tài)”進(jìn)行設(shè)置

負(fù)載均衡時(shí)Session共享的問(wèn)題應(yīng)該怎么樣解決

啟用本機(jī)的狀態(tài)服務(wù)

負(fù)載均衡時(shí)Session共享的問(wèn)題應(yīng)該怎么樣解決

會(huì)自動(dòng)在web.config里生成配置文件(如果不能生成就手動(dòng)添加)

<sessionState mode=”StateServer” stateConnectionString=”tcpip=loopback:42424″ timeout=”20″ />

但是這里就存在一個(gè)問(wèn)題,如果每臺(tái)服務(wù)器都照上面配置,各服務(wù)器的Session都存儲(chǔ)在本機(jī)的StateServer里面,還是沒(méi)有啟動(dòng)共享的作用,這里就需要讓一臺(tái)StateServer共享出來(lái)讓其他服務(wù)器訪問(wèn),并將Session存儲(chǔ)到上面,運(yùn)行regedit → 打開(kāi)注冊(cè)表 → 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters節(jié)點(diǎn) → 將 AllowRemoteConnection 的鍵值設(shè)置成“1”(1 為允許遠(yuǎn)程電腦的連接,0 代表禁止)

負(fù)載均衡時(shí)Session共享的問(wèn)題應(yīng)該怎么樣解決


也可以修改StateServer的端口

負(fù)載均衡時(shí)Session共享的問(wèn)題應(yīng)該怎么樣解決


接下來(lái)將其它服務(wù)器中web.config的配置文件進(jìn)行修改(sessionState指向開(kāi)啟了允許遠(yuǎn)程訪問(wèn)的StateServer)

<sessionState mode=”StateServer” stateConnectionString=”tcpip=10.16.5.30:22222″ timeout=”20″ />

用StateServer這種共享式的session存儲(chǔ)方式不僅有安全隱患,而且像上面那臺(tái)共享的StateServer只要重啟服務(wù)器,所有的session都會(huì)丟失,所以這種session存儲(chǔ)方式不是很完美,用StateServer存儲(chǔ)sesssion比較適合單機(jī)IIS開(kāi)啟多進(jìn)程的。

負(fù)載均衡時(shí)Session共享的問(wèn)題應(yīng)該怎么樣解決

三、使用SQL server存儲(chǔ)session

      要做保證安全并且不會(huì)因?yàn)橹貑⒎?wù)器導(dǎo)致session丟失,那就要用sql server來(lái)存儲(chǔ)session,ASP.NET 2.0版本后微軟提供了aspnet_regsql.exe工具可以方便的配置Session數(shù)據(jù)庫(kù).該工具位于 Web 服務(wù)器上的系統(tǒng)根目錄Microsoft.NETFramework版本號(hào)文件夾中

cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319
aspnet_regsql.exe  -ssadd -sstype c -d <Database Name> -S <SQL Server IP> -U <User Name> -P <Password>
aspnet_regsql.exe  -ssadd -sstype c -d ASPState -S 10.16.5.36 -U sa -P HAha789

注:<Database Name>為數(shù)據(jù)庫(kù)名為ASPState ,<SQL Server IP>為數(shù)據(jù)庫(kù)實(shí)例名像 IBM-PC\SQLEXPRESS  (若數(shù)據(jù)庫(kù)不是2005的不要寫ip地址,否則會(huì)連接失敗),<User Name>為sa(或與sa同等權(quán)限的),<Password> 為 sa用戶名的密碼會(huì)話定義成功,但是會(huì)提示在web應(yīng)用中進(jìn)行相應(yīng)的配置,此時(shí)查看SQLServer會(huì)發(fā)現(xiàn)增加了數(shù)據(jù)庫(kù)ASPState,但是沒(méi)有表。

在命令行下運(yùn)行如下命令:aspnet_regsql.exe  -ssadd -sstype p -S <SQL Server IP> -U <User Name> -P <Password>

aspnet_regsql.exe  -ssadd -sstype p -S 10.16.5.36 -U sa -P HAha789

負(fù)載均衡時(shí)Session共享的問(wèn)題應(yīng)該怎么樣解決

該命令對(duì)此應(yīng)用進(jìn)行了持久化操作。這時(shí)會(huì)看到ASPState數(shù)據(jù)庫(kù)里面多了兩張表,ASPStateTempSession就可以用來(lái)保存Session,接下來(lái)要對(duì)web站點(diǎn)的“會(huì)話狀態(tài)”進(jìn)行設(shè)置

負(fù)載均衡時(shí)Session共享的問(wèn)題應(yīng)該怎么樣解決

ASPStateTempSessions 表中的SessionID ,包括兩個(gè)部分:網(wǎng)站生成的24位SessionID及8位AppId組成,對(duì)于不同的站點(diǎn),其AppId和AppName也不同,在能夠在不同站點(diǎn)下Session共享,就得保證這個(gè)32位的SessionID 一致,所以可以通過(guò)修改存儲(chǔ)過(guò)程TempGetAppID,使其得到的SessionID與AppName無(wú)關(guān),修改TempGetAppID如下

負(fù)載均衡時(shí)Session共享的問(wèn)題應(yīng)該怎么樣解決

修改web.config(在數(shù)據(jù)庫(kù)中為ASPState單獨(dú)分配一個(gè)帳戶)

<sessionState mode="SQLServer" sqlConnectionString="data source=10.16.5.36;user id=sa;password=HAha789" cookieless="false" timeout="20"></sessionState>

這樣就實(shí)現(xiàn)了sql server對(duì)session的存儲(chǔ),當(dāng)然也可以用memcache來(lái)存儲(chǔ)session


四、ASP.NET錯(cuò)誤,驗(yàn)證視圖狀態(tài)MAC失敗

      但在在網(wǎng)站登錄訪問(wèn)時(shí)卻報(bào)錯(cuò)了“ASP.NET錯(cuò)誤,驗(yàn)證視圖狀態(tài)MAC失敗”,baidu了一下,大部分人都說(shuō)是在頁(yè)里或web.config里加EnableEventValidation="false" EnableViewStateMac="false" ViewStateEncryptionMode="Never" 這些屬性的設(shè)置。但是這并不從根本上解決問(wèn)題,相反這樣做了反而更加不安全。不能說(shuō)出錯(cuò)就不用了?出錯(cuò)得解決問(wèn)題,得從根本上解決問(wèn)題。


分析錯(cuò)誤原因:

ASP.NET 中有很多涉及到加密的東西,比如 ViewState,比如 FormsAuthenticationTicket,這些東西都是要傳送到客戶端的,加密才能保障其安全性。加密就得有個(gè)私鑰,但這個(gè)私鑰我們并沒(méi)有指定啊,那是因?yàn)?ASP.NET 自動(dòng)生成的。但是如果是在網(wǎng)絡(luò)場(chǎng)或群集中,或者在某些做了 CDN 加載的虛擬主機(jī)中,由于涉及到多臺(tái)服務(wù)器 ASP.NET 就無(wú)法為各臺(tái)機(jī)器自動(dòng)生成相同的私鑰,這就造成了這個(gè)服務(wù)器產(chǎn)生的數(shù)據(jù),那臺(tái)服務(wù)器解析不出來(lái)。于是就出錯(cuò)了。怎么辦?既然 ASP.NET 在多臺(tái)服務(wù)器上無(wú)法自動(dòng)隨機(jī)生成相同的私鑰,那只有我們自己指定了。

MachineKey生成工具,自動(dòng)生成代碼

https://www.fishlee.net/tools/machinekeygenerator

將生成的Machinekey插入到web.config中:

<system.web>
<machineKey validationKey="A89B01ED6C356FCFEEB884EA523D7827F719C7A9F26BCC808A109C516D57DF91D2D7612127F06957C6643913DB893F66492A2FB85D44805735BA96DF41071B0F" decryptionKey="E9F179A7EF94763ABD9A79B07BA61F49550235125FADEF942BD2045B2A9803C8" validation="SHA1" decryption="AES" />
</system.web>

MachineKey的作用:

ASP.net 使用 forms authentication 時(shí)的 cookie 數(shù)據(jù)的加密和解密。以確保這部分?jǐn)?shù)據(jù)不會(huì)被篡改viewstate 數(shù)據(jù)的加密和解密。以確保這部分?jǐn)?shù)據(jù)不會(huì)被篡改。使用進(jìn)程外session(out-of-process session)時(shí),對(duì)會(huì)話狀態(tài)標(biāo)識(shí)進(jìn)行驗(yàn)證。利用SessionStateMode的SQLServer來(lái)實(shí)現(xiàn)session共享,畢竟是微軟的東西,具有一定的局限行,只能是sql server。其實(shí)session共享可以用其他的數(shù)據(jù)庫(kù),比如memcache、redis


五、ASP.NET 狀態(tài)數(shù)據(jù)庫(kù)FAQ

1、如果把SESSION值存放到數(shù)據(jù)庫(kù)中去,用戶關(guān)閉了程序那怎么樣清空數(shù)據(jù)庫(kù)里的SESSION值呢?

   實(shí)際ASP.NET在創(chuàng)建狀態(tài)數(shù)據(jù)庫(kù)的時(shí)候會(huì)在SQL Server代理(SQL Server Agent)的作業(yè)中添加一個(gè)作業(yè),名稱為<狀態(tài)數(shù)據(jù)庫(kù)名>_Job_DeleteExpiredSessions。如果打開(kāi)SQL Server代理服務(wù)數(shù)據(jù)庫(kù)可以通過(guò)添加的狀態(tài)記錄的超時(shí)時(shí)間字段(Exprires)定期對(duì)超時(shí)的狀態(tài)數(shù)據(jù)進(jìn)行刪除。

負(fù)載均衡時(shí)Session共享的問(wèn)題應(yīng)該怎么樣解決

2、ASPStateTempSessions表中的SessionId字段如何使用?

數(shù)據(jù)庫(kù)中此表的SessionID字段的值,由SessionID和AppID共同組成,最后8位為AppID所以,后8位之前一定是SessionID。例如,存儲(chǔ)在數(shù)據(jù)庫(kù)中的值為"ekr30c3mwvnc3145yrswew3a037e5e5a",后8位的"037e5e5a"為AppID,而前面的"ekr30c3mwvnc3145yrswew3a"為應(yīng)用程序中你可以使用Session.SessionID獲得的字符串。

負(fù)載均衡時(shí)Session共享的問(wèn)題應(yīng)該怎么樣解決

3、如何判斷Session何時(shí)被更新的?

Session記錄被更新時(shí)會(huì)同時(shí)更新Expires和LockDateLocal,Expires字段為UTC時(shí)間,如果想通過(guò)本地之間進(jìn)行比較判斷還是需要使用LockDateLocal。

4、獲得Web.config配置文件節(jié)點(diǎn)信息的程序?

''獲得Web.config文件配置實(shí)例

Dim configuration As System.Configuration.Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~/web.config")

''獲得狀態(tài)配置節(jié)點(diǎn)實(shí)例

Dim mSessionStateSection As System.Web.Configuration.SessionStateSection = CType(configuration.GetSection("system.web/sessionState"),System.Web.Configuration.SessionStateSection)

''獲得狀態(tài)模式

Response.Write(mSessionStateSection.Mode)

''獲得狀態(tài)超時(shí)時(shí)間

Response.Write(mSessionStateSection.Timeout)

看了以上關(guān)于負(fù)載均衡時(shí)Session共享的問(wèn)題應(yīng)該怎么樣解決,如果大家還有什么地方需要了解的可以在億速云行業(yè)資訊里查找自己感興趣的或者找我們的專業(yè)技術(shù)工程師解答的,億速云技術(shù)工程師在行業(yè)內(nèi)擁有十幾年的經(jīng)驗(yàn)了。億速云官網(wǎng)鏈接www.kemok4.com

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI