多站點共享session常見的做法有:
•使用.net自動的狀態服務(asp.net state service);
•使用.net的session資料庫;
•使用memcached。
•使用cookie方式實現多個站點間的共享(這種方式只限於幾個站點都在同一域名的情況下);
這裡我們就演練一下以數據庫的形來存儲session,來實現多站點共享session。
首先我們建立好站點,如下圖:
default.aspx
##其中有二個button ,setsession 主要是用來給一個session 賦值(如:session["sharevalue"] = “abcd”) ,
程式碼部分就這麼多就行了…
這個節點中增加machinekey 及sessionstate 這兩個節點,
1.增加machinekey 主要作用是:
「按照msdn的標準說法:「對金鑰進行配置,以便將其用於對forms 身份驗證cookie 資料和視圖狀態資料進行加密和解密,並將其用於對進程外會話狀態標識進行驗證。 「也就是說asp.net的許多加密,都是依賴machinekey裡面的值,例如forms 身份驗證cookie、viewstate的加密。預設情況下,asp.net的配置是自己動態生成,如果單一伺服器當然沒問題,但是如果多台伺服器負載平衡,machinekey還採用動態生成的方式,每台伺服器上的machinekey值不一致,就導致加密出來的結果也不一致,不能共享驗證和viewstate,所以對於多台伺服器負載平衡的情況,一定要在每台站點配置相同的machinekey。“ ,具體可以查一下其它資料。
2.增加 sessionstate 主要是讓 session 保存在資料庫中。
具體配置如下:
複製程式碼 程式碼如下:
網站部分這樣就好了。 。 。下面就是要設定據庫了…..
資料庫設定:
使用aspnet_regsql.exe工具
asp.net 2.0版本後微軟提供了aspnet_regsql.exe工具可以方便的設定session資料庫.該工具位於web 伺服器上的"系統根目錄\microsoft.net\framework\版本號"資料夾中.
使用範例:
aspnet_regsql.exe -s . -u sa - p 123456 -ssadd -sstype p
-s參數:
表示資料庫實例名稱.可以用"."表示本機.
-u和-p參數:
表示使用者名稱和密碼.
-e參數:
-ssadd / –ssremove 參數:-ssadd表示是新增session資料庫, -ssremove表示移除session資料庫.
sstype 參數說明:###t###將會話資料儲存到sql server tempdb資料庫中。這是預設值。如果將會話資料儲存到 tempdb 資料庫中,則在重新啟動 sql server 時將遺失會話資料。 ######將會話資料儲存到 aspstate 資料庫中,而不是儲存到 tempdb 資料庫。 ###c###將會話資料儲存到自訂資料庫。如果指定 c 選項,則必須也使用 -d 選項來包含自訂資料庫的名稱。 ###我的設定是:aspnet_regsql.exe -s . - e -d awbuisession -ssadd -sstype c######好了。基本的 我們就已經搞定了。 。 ###現在 我們分別把我們剛建造的一個網站 部署 到 iis 中。不過我們既然要負載。至少也的部署兩份。 ############### ###我們把 其中一個 伺服器中的 defaut.aspx 中 “伺服器 1” 改成 “伺服器 2” ,這樣做的主要目地是 做一下 區別!
如下:
兩個網站的url分別是:
server 1:127.0.0.1:8081;
server 2:127.0.0.1:8080;
ok。下面我們就是 配置 nignx了。
先在nginx\conf 設定 檔案中找到nginx.conf 這個文件,就記事本打開,
做如上的設定:
ok。 nginx 這樣設定 就算ok 了。讓我們啟動nginx ..
在瀏覽器中輸入我們在nginx 中設定的url 如:127.0.0.1:8090
##
我們會看到伺服器1 已經開始為我們服務了,我們再點一下「setsession」來設定一個會話值, 我們會看到伺服器2 開始工作。這時我們再點一下「getsesion」來看看剛才在伺服器1 設定的會話值,結果如下: 出現這種情況,主要就是在資料庫中儲存一個會話時沒有做到伺服器1 與服務2的session 共享,主要是在 #aspstatetempsessions 這個表中的一個sessionid ,#其中的sessionid包括兩個部分:網站產生的24位元sessionid及8位元appname對於不同的站點,其appname不同,在能夠在不同站點下使24位元sessionid相同的情況下,要保證經過組合加上appname後的sessionid相同,可以透過修改預存程序tempgetappid,使其得到的sessionid與appname無關,修改tempgetappid如下:複製程式碼 程式碼如下:alter procedure [dbo].[tempgetappid]
@appname tappname,
@appid int output
as
set @appname = 'test' --lower(@appname) 修改這裡,讓多個網站的appname ,為一個固定值。
set @appid = null
select @appid = appid
from [awbuisession].dbo.aspstatetempapplications
where appname = @appname
if @appid is null begin
begin tran
#begin tran
#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 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
以上是nginx怎麼實現負載平衡多站點共享Session的詳細內容。更多資訊請關注PHP中文網其他相關文章!