【轉(zhuǎn)】nginx 負(fù)載均衡,多站點(diǎn)共享Session
Posted on 2012-11-06 13:51 小胡子 閱讀(338) 評(píng)論(1) 編輯 收藏多站點(diǎn)共享Session常見的作法有:
- 使用.net自動(dòng)的狀態(tài)服務(wù)(Asp.net State Service);
- 使用.net的Session數(shù)據(jù)庫(kù);
- 使用Memcached。
- 使用Cookie方式實(shí)現(xiàn)多個(gè)站點(diǎn)間的共享(這種方式只限于幾個(gè)站點(diǎn)都在同一域名的情況下);
這里我們就 演練一下 以數(shù)據(jù)庫(kù)的形來(lái)存儲(chǔ)Session,來(lái)實(shí)現(xiàn)多站點(diǎn)共享Session。
首先我們 建好一下站點(diǎn),如下圖:
Default.aspx
其中 有二個(gè)Button ,SetSession 主要是用于給一個(gè) Session 賦值(如:Session["ShareValue"] = “abcd”
) ,
GetSession 主要就是獲得 一個(gè) Session 值。
具體代碼如下:
代碼部分就這么多就行了…
下面就是要配置一下 Web.config了 , 其實(shí)主要就是在 <system.web>
這個(gè)節(jié)點(diǎn)中 增加 machineKey 及 sessionState 這兩個(gè)節(jié)點(diǎn),
1.增加machineKey 主要作用是:
“按照MSDN的標(biāo)準(zhǔn)說(shuō)法:“對(duì)密鑰進(jìn)行配置,以便將其用于對(duì) Forms 身份驗(yàn)證 Cookie 數(shù)據(jù)和視圖狀態(tài)數(shù)據(jù)進(jìn)行加密和解密,并將其用于對(duì)進(jìn)程外會(huì)話狀態(tài)標(biāo)識(shí)進(jìn)行驗(yàn)證。”也就是說(shuō)Asp.Net的很多加密,都是依賴于machineKey里面 的值,例如Forms 身份驗(yàn)證 Cookie、ViewState的加密。默認(rèn)情況下,Asp.Net的配置是自己動(dòng)態(tài)生成,如果單臺(tái)服務(wù)器當(dāng)然沒(méi)問(wèn)題,但是如果多臺(tái)服務(wù)器負(fù)載均 衡,machineKey還采用動(dòng)態(tài)生成的方式,每臺(tái)服務(wù)器上的machinekey值不一致,就導(dǎo)致加密出來(lái)的結(jié)果也不一致,不能共享驗(yàn)證和 ViewState,所以對(duì)于多臺(tái)服務(wù)器負(fù)載均衡的情況,一定要在每臺(tái)站點(diǎn)配置相同的machineKey。“ ,具體可以查一下其它資料。
2.增加 sessionState 主要是讓 Session 保存在數(shù)據(jù)庫(kù)中。
具體配置如下:
<sessionState mode="SQLServer" sqlConnectionString="Data Source=PC-07195;Initial Catalog=AWBUISession;Persist Security Info=True;User ID=jins;Password=js@#$1234" allowCustomSqlDatabase="true" cookieless="false" timeout="100"/>
數(shù)據(jù)庫(kù)配置:
使用aspnet_regsql.exe工具
ASP.NET 2.0版本后微軟提供了aspnet_regsql.exe工具可以方便的配置Session數(shù)據(jù)庫(kù).該工具位于 Web 服務(wù)器上的"系統(tǒng)根目錄\Microsoft.NET\Framework\版本號(hào)"文件夾中.
使用舉例:
表示數(shù)據(jù)庫(kù)實(shí)例名稱. 可以用"."表示本機(jī).
-U和-P參數(shù):
表示用戶名和密碼.
-E參數(shù):
可以再-U –P 與 -E中選擇一組. –E表示以當(dāng)前系統(tǒng)用戶通過(guò)windows身份驗(yàn)證登錄數(shù)據(jù)庫(kù), -U -P則是使用SqlServer用戶登錄數(shù)據(jù)庫(kù).
-ssadd / –ssremove 參數(shù):
-ssadd表示是添加Session數(shù)據(jù)庫(kù), -ssremove表示移除Session數(shù)據(jù)庫(kù).
sstype 參數(shù)說(shuō)明:
t | 將會(huì)話數(shù)據(jù)存儲(chǔ)到 SQL Server tempdb 數(shù)據(jù)庫(kù)中。這是默認(rèn)設(shè)置。如果將會(huì)話數(shù)據(jù)存儲(chǔ)到 tempdb 數(shù)據(jù)庫(kù)中,則在重新啟動(dòng) SQL Server 時(shí)將丟失會(huì)話數(shù)據(jù)。 |
p | 將會(huì)話數(shù)據(jù)存儲(chǔ)到 ASPState 數(shù)據(jù)庫(kù)中,而不是存儲(chǔ)到 tempdb 數(shù)據(jù)庫(kù)中。 |
c | 將會(huì)話數(shù)據(jù)存儲(chǔ)到自定義數(shù)據(jù)庫(kù)中。如果指定 c 選項(xiàng),則還必須使用 -d 選項(xiàng)包括自定義數(shù)據(jù)庫(kù)的名稱。 |
我的設(shè)置是:aspnet_regsql.exe -S . - E -d AWBUISession -ssadd -sstype c
好了?;镜?我們就已經(jīng)搞定了。。
我們把 其中一個(gè) 服務(wù)器中的 defaut.aspx 中 “服務(wù)器 1” 改成 “服務(wù)器 2” ,這樣做的主要目地是 做一下 區(qū)別!
具體如下:
兩個(gè)網(wǎng)站的 URL分別是:
server 1:127.0.0.1:8081;
server 2:127.0.0.1:8080;
OK。下面我們就是 配置 Nignx了。
做如上的 設(shè)置:
OK。 nginx 這樣配置 就算OK 了。 我們啟動(dòng)一下 nginx ..
在瀏覽器中 輸入我們 在 nginx 中配置的 URL 如:127.0.0.1:8090
@appName tAppName,
@appId int OUTPUT
AS
SET @appName = 'Test' --LOWER(@appName) 修改這里,使多個(gè)站點(diǎn)的APPname ,為一個(gè)固定值。
SET @appId = NULL
SELECT @appId = AppId
FROM [AWBUISession].dbo.ASPStateTempApplications
WHERE AppName = @appName
IF @appId IS NULL BEGIN
BEGIN TRAN
SELECT @appId = AppId
FROM [AWBUISession].dbo.ASPStateTempApplications WITH (TABLOCKX)
WHERE AppName = @appName
IF @appId IS NULL
BEGIN
EXEC GetHashCode @appName, @appId OUTPUT
INSERT [AWBUISession].dbo.ASPStateTempApplications
VALUES
(@appId, @appName)
IF @@ERROR = 2627
BEGIN
DECLARE @dupApp tAppName
SELECT @dupApp = RTRIM(AppName)
FROM [AWBUISession].dbo.ASPStateTempApplications
WHERE AppId = @appId
RAISERROR('SQL session state fatal error: hash-code collision between applications ''%s'' and ''%s''. Please rename the 1st application to resolve the problem.', 18, 1, @appName, @dupApp)
END
END
COMMIT
END
RETURN 0
重啟一下各站點(diǎn)。再在瀏覽一下網(wǎng)站點(diǎn) “SetSession”, 再點(diǎn):“GetSession” 這樣 我們就看到 服務(wù)器2 給出了我們 剛才在 服務(wù)器 1 中設(shè)置 的會(huì)話值了。
原文出自: