ホームページ  >  記事  >  運用・保守  >  nginx がロード バランシングとマルチサイト共有セッションを実装する方法

nginx がロード バランシングとマルチサイト共有セッションを実装する方法

王林
王林転載
2023-05-17 08:31:131183ブラウズ

複数のサイト間でセッションを共有する一般的な方法は次のとおりです。
•.net 自動状態サービス (asp.net 状態サービス) を使用する;
•.net セッション データベースを使用する;
•memcached を使用します。
•Cookie を使用して複数のサイト間で共有を実現します (この方法は、複数のサイトが同じドメイン名にある場合にのみ限定されます);
ここでは、セッションをデータベースの形式で保存してマルチサイトを実現する練習をします。 -サイト共有セッション。

まず、以下に示すようにサイトを構築します。

nginx がロード バランシングとマルチサイト共有セッションを実装する方法

default.aspx

nginx がロード バランシングとマルチサイト共有セッションを実装する方法

ボタンは 2 つあり、setsession は主にセッションに値を割り当てるために使用されます (例: session["sharevalue"] = "abcd")。

getsession は主にセッション値を取得するために使用されます。

具体的なコードは次のとおりです:

nginx がロード バランシングとマルチサイト共有セッションを実装する方法

コード部分はこれですべてです...

次のステップは、Web を構成することです。 .config. 実際、主なことは、machinekey と sessionstate の 2 つのノードをノード
に追加することです。
1. machinekey を追加する主な機能は次のとおりです:
"によるとmsdn の標準ステートメント: 「フォーム認証 Cookie データとビュー ステート データの暗号化と復号化、およびアウトプロセス セッション状態 ID の検証に使用されるように、キーを構成に追加します。 「つまり、フォーム認証 Cookie やビューステートの暗号化など、asp.net の多くの暗号化は machinekey の値に依存します。デフォルトでは、asp.net の構成は自動的に動的に生成されます。単一のサーバーでは問題ありませんが、複数のサーバーが負荷分散されている場合、マシンキーも動的に生成されます。各サーバーのマシンキーの値が一貫していないため、暗号化の結果が不一致になります。検証とビューステートは共有できないため、複数のサーバーの負荷分散ではこの場合、各サイトで同じマシンキーを構成する必要があります。」詳細については、他の情報を確認してください。
2. セッション状態を追加すると、主にセッションをデータベースに保存できるようになります。
具体的な構成は次のとおりです:

コードをコピーします コードは次のとおりです:


decryptionkey="9421e53e196bb56db11b9c25197a2ad470638efbc604ac74cd29dbbcf79d6046"
validation="sha1" decryption="aes"/>



ウェブサイト部分は問題ありません。 。 。以下はデータベースを構成する手順です...

データベース構成:
aspnet_regsql.exe ツールを使用する
asp.net バージョン 2.0 以降、Microsoft はセッションを簡単に構成するための aspnet_regsql.exe ツールを提供しています。このツールは、Web サーバーの "システム ルート ディレクトリ\microsoft.net\framework\versionnumber" フォルダーにあります。

使用例:

aspnet_regsql.exe -s . - u sa - p 123456 -ssadd -sstype p
-s パラメータ:
はデータベース インスタンス名を表します。「.」を使用してローカル マシンを表すことができます。
-u および -p パラメータ:
はユーザー名とパスワードを表します。
-e パラメータ:
-u –p と -e の間でグループを選択できます。-e は、現在のシステム ユーザーとして Windows 認証を通じてデータベースにログインすることを意味します。
-ssadd / –ssremove パラメータ:
-ssadd はセッション データベースの追加を意味し、-ssremove はセッション データベースの削除を意味します。パラメータの説明:
t
セッション データをデータベースの SQL Server tempdb に保存します。これがデフォルトの設定です。セッション データが tempdb データベースに保存されている場合、SQL サーバーが再起動されるとセッション データは失われます。

セッション データを tempdb データベースではなく aspstate データベースに保存します。
c
セッション データをカスタム データベースに保存します。 c オプションを指定する場合は、-d オプションを使用してカスタム データベースの名前も含める必要があります。
私の設定は次のとおりです: aspnet_regsql.exe -s . - e -d awbuisession -ssadd -sstype c

わかりました。基本はこれで終わりです。 。
次に、構築したばかりの Web サイトを iis にデプロイします。しかし、ロードしたいので。少なくとも 2 つのコピーを展開する必要があります。


nginx がロード バランシングとマルチサイト共有セッションを実装する方法

サーバーの 1 つで defaut.aspx の "サーバー 1" を "サーバー 2" に変更しました。これを行う主な目的は、違いを生むことです。

詳細は次のとおりです。

nginx がロード バランシングとマルチサイト共有セッションを実装する方法

2 つの Web サイトの URL は次のとおりです。

サーバー 1: 127.0.0.1:8081;

サーバー 2:127.0.0.1:8080;

わかりました。次にnignxの設定を行っていきます。

まず、nginx\conf 構成ファイルで nginx.conf ファイルを見つけ、メモ帳で開き、

nginx がロード バランシングとマルチサイト共有セッションを実装する方法

上記の設定を行います:

# ##わかりました。 nginx がこのように設定されていれば問題ありません。 nginx を開始しましょう。

nginx で設定した URL をブラウザに入力します (例: 127.0.0.1:8090

nginx がロード バランシングとマルチサイト共有セッションを実装する方法

サーバー 1 が表示されます)サービスの提供を開始しました。もう一度「setsession」をクリックしてセッション値を設定しましょう。

nginx がロード バランシングとマルチサイト共有セッションを実装する方法

サーバー 2 が動作し始めるのがわかります。この時点で、もう一度「getsesion」をクリックして、サーバー 1 に設定されたばかりのセッション値を確認します。結果は次のようになります。

nginx がロード バランシングとマルチサイト共有セッションを実装する方法

これが発生した場合の主な理由は次のとおりです。セッション値をデータベースに保存します。サーバー 1 とサービス 2 の間のセッションは、主に

nginx がロード バランシングとマルチサイト共有セッションを実装する方法

aspstatetempsessions テーブル ## の sessionid が原因で、セッション中に共有されません。

#セッション ID には、Web サイトによって生成された 24 ビットのセッション ID と 8 ビットのアプリ名という 2 つの部分が含まれます。サイトが異なると、アプリ名は異なります。24 ビットのセッション ID を異なるサイトで同じにできる場合は、アプリ名を結合して追加した後のセッション ID が同じであることを確認する必要があります。取得したセッション ID がアプリ名と無関係になるように、ストアド プロシージャ tempgetappid を変更できます。次のように tempgetappid を変更します:

コードをコピーします。は次のとおりです:

alter プロシージャ [dbo].[tempgetappid]

@appname Tappname,
@appid int Output
as
set @appname = 'test' -- lower(@appname) 複数のサイトのアプリ名が固定値になるようにこれを変更します。
set @appid = null
select @appid = appid
from [awbuisession].dbo.aspstatetempapplications
where appname = @appname
@appid が 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 @dupapptappname
select @dupapp = rtrim(appname)
from [awbuisession].dbo.aspstatetempapplications
where appid = @appid
raiserror('SQL セッション状態の致命的なエラー: アプリケーション ''%s 間のハッシュ コードの衝突'' と ''%s''。問題を解決するには、最初のアプリケーションの名前を変更してください。',
18, 1, @appname, @dupapp)
end
end
commit
end
return 0


上記の変更後、複数のサイトが同じセッション ID を共有していることを認識する必要があります。



各サイトを再起動します。 Web サイトを再度参照します。

#「setsession」をクリックし、nginx がロード バランシングとマルチサイト共有セッションを実装する方法

「getsession」を再度クリックします。 nginx がロード バランシングとマルチサイト共有セッションを実装する方法

このようにして、サーバー 2 がサーバー 1 に設定したばかりのセッション値を提供していることがわかります。 nginx がロード バランシングとマルチサイト共有セッションを実装する方法

もう一度「getsession」をクリックしてみましょう。

サーバー 1 とサーバー 2 が同じ結果を返し、「マルチサイト共有」セッションが実現していることがわかります。 ''nginx がロード バランシングとマルチサイト共有セッションを実装する方法

追加のポイント: セッションの有効期限は、主に SQL サーバー エージェントのジョブが完了したときに削除されます。

以上がnginx がロード バランシングとマルチサイト共有セッションを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。