首頁 >運維 >Nginx >nginx怎麼實現負載平衡多站點共享Session

nginx怎麼實現負載平衡多站點共享Session

王林
王林轉載
2023-05-17 08:31:131245瀏覽

多站點共享session常見的做法有:
•使用.net自動的狀態服務(asp.net state service);
•使用.net的session資料庫;
•使用memcached。
•使用cookie方式實現多個站點間的共享(這種方式只限於幾個站點都在同一域名的情況下);
這裡我們就演練一下以數據庫的形來存儲session,來實現多站點共享session。

首先我們建立好站點,如下圖:

nginx怎麼實現負載平衡多站點共享Session 

default.aspx 

nginx怎麼實現負載平衡多站點共享Session

nginx怎麼實現負載平衡多站點共享Session







##其中有二個button  ,setsession 主要是用來給一個session 賦值(如:session["sharevalue"] = “abcd”) ,

getsession 主要就是要得到一個session 值。

具體程式碼如下:



  

 程式碼部分就這麼多就行了…

下面就是要設定web.config了, 其實主要就是在

這個節點中增加machinekey 及sessionstate 這兩個節點,
1.增加machinekey 主要作用是:
「按照msdn的標準說法:「對金鑰進行配置,以便將其用於對forms 身份驗證cookie 資料和視圖狀態資料進行加密和解密,並將其用於對進程外會話狀態標識進行驗證。 「也就是說asp.net的許多加密,都是依賴machinekey裡面的值,例如forms 身份驗證cookie、viewstate的加密。預設情況下,asp.net的配置是自己動態生成,如果單一伺服器當然沒問題,但是如果多台伺服器負載平衡,machinekey還採用動態生成的方式,每台伺服器上的machinekey值不一致,就導致加密出來的結果也不一致,不能共享驗證和viewstate,所以對於多台伺服器負載平衡的情況,一定要在每台站點配置相同的machinekey。“ ,具體可以查一下其它資料。
2.增加 sessionstate 主要是讓 session 保存在資料庫中。
具體配置如下:



複製程式碼 程式碼如下:


decryptionkey="9421e53e196bb56db11b9c25197a2ad470638efbcbb600 ##validation="sha1" decryption="aes"/>





網站部分這樣就好了。 。 。下面就是要設定據庫了…..

資料庫設定:
使用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參數:

可以再-u –p 與-e中選擇一組. –e表示以當前系統使用者透過windows驗證登入資料庫, -u -p則是使用sqlserver使用者登入資料庫.

-ssadd / –ssremove 參數:nginx怎麼實現負載平衡多站點共享Session-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” ,這樣做的主要目地是 做一下 區別!

如下:

 nginx怎麼實現負載平衡多站點共享Session

兩個網站的url分別是:

 server 1:127.0.0.1:8081;

server 2:127.0.0.1:8080;   

ok。下面我們就是 配置 nignx了。

先在nginx\conf 設定 檔案中找到nginx.conf 這個文件,就記事本打開, 

nginx怎麼實現負載平衡多站點共享Session 

做如上的設定:

ok。  nginx  這樣設定 就算ok 了。讓我們啟動nginx ..

在瀏覽器中輸入我們在nginx 中設定的url 如:127.0.0.1:8090 

## nginx怎麼實現負載平衡多站點共享Session

我們會看到伺服器1 已經開始為我們服務了,我們再點一下「setsession」來設定一個會話值,

nginx怎麼實現負載平衡多站點共享Session

我們會看到伺服器2 開始工作。這時我們再點一下「getsesion」來看看剛才在伺服器1 設定的會話值,結果如下: 

nginx怎麼實現負載平衡多站點共享Session

出現這種情況,主要就是在資料庫中儲存一個會話時沒有做到伺服器1 與服務2的session 共享,主要是在 

nginx怎麼實現負載平衡多站點共享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

return 0



經過以上修改之後,下面要實作多個網站共用同一個sessionid.

##重啟一下各網站。再在瀏覽網站 

nginx怎麼實現負載平衡多站點共享Session

點「setsession」, 

nginx怎麼實現負載平衡多站點共享Session

再點:「getsession」 

nginx怎麼實現負載平衡多站點共享Session

這樣我們就看到伺服器2 給了我們剛才在伺服器1 中設定的會話值了。

我們再點:“getsession”, 

nginx怎麼實現負載平衡多站點共享Session

#可以看到 伺服器1 和伺服器2 回傳的是相同的結果,達到了「多站點共享session”

 附加一點: session 過期刪除,主要是在sql server 代理中的  作業完成。

nginx怎麼實現負載平衡多站點共享Session

###

以上是nginx怎麼實現負載平衡多站點共享Session的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除