nginx 負載平衡,多網站共用Session

來源:互聯網
上載者:User
nginx 負載平衡,多網站共用Session

多網站共用Session常見的作法有:

  • 使用.net自動的狀態服務(Asp.net State Service);
  • 使用.net的Session資料庫;
  • 使用Memcached。
  • 使用Cookie方式實現多個網站間的共用(這種方式只限於幾個網站都在同一網域名稱的情況下); 

這裡我們就 演練一下 以資料庫的形來儲存Session,來實現多網站共用Session。 

首先我們 建好一下網站,如: 

 

Default.aspx 

其中 有二個Button  ,SetSession 主要是用於給一個 Session 賦值(如:Session["ShareValue"] = “abcd”

) ,

GetSession 主要就是獲得 一個 Session 值。

具體代碼如下:

  

 代碼部分就這麼多就行了…

 

下面就是要配置一下 Web.config了 , 其實主要就是在 <system.web>

 這個節點中 增加 machineKey 及 sessionState 這兩個節點,

1.增加machineKey 主要作用是:

“按照MSDN的標準說法:“對密鑰進行配置,以便將其用於對 Forms 身分識別驗證 Cookie 資料和檢視狀態資料進行加密和解密,並將其用於對進程外工作階段狀態標識進行驗證。”也就是說Asp.Net的很多加密,都是依賴於machineKey裡面的值,例如Forms 身分識別驗證 Cookie、ViewState的加密。預設情況下,Asp.Net的配置是自己動態產生,如果單台伺服器當然沒問題,但是如果多台伺服器負載平衡,machineKey還採用動態產生的方式,每台伺服器上的machinekey值不一致,就導致加密出來的結果也不一致,不能共用驗證和ViewState,所以對於多台伺服器負載平衡的情況,一定要在每台網站配置相同的machineKey。“ ,具體可以查一下其它資料。

2.增加 sessionState 主要是讓 Session 儲存在資料庫中。 

具體配置如下:

<machineKey validationKey="86B6275BA31D3D713E41388692FCA68F7D20269411345AA1C17A7386DACC9C46E7CE5F97F556F3CF0A07159659E2706B77731779D2DA4B53BC47BFFD4FD48A54"

                decryptionKey="9421E53E196BB56DB11B9C25197A2AD470638EFBC604AC74CD29DBBCF79D6046"

   validation="SHA1" decryption="AES"/> 

 <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"/>

 

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

 

資料庫配置:

使用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 參數:

-ssadd表示是添加Session資料庫, -ssremove表示移除Session資料庫.

sstype 參數說明:

t

將會話資料存放區到 SQL Server tempdb 資料庫中。這是預設設定。如果將會話資料存放區到 tempdb 資料庫中,則在重新啟動 SQL Server 時將丟失會話資料。

p

將會話資料存放區到 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  

        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                        

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

 

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

點 “SetSession”, 

 

再點:“GetSession” 

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

 

我們 再點:“GetSession”, 

 

可以看到  伺服器1 和伺服器 2 返回的是相同的結果,達到了 “多網站共用Session”

 

 附加一點: Session 到期刪除,主要是 在 SQL server 代理中的  作業完成。

具體的可以,查一下其它相關資料.

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.