セッションサーバー構成ガイドと使用体験の詳細な分析_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:05:44
オリジナル
900 人が閲覧しました

1. 概要
すべての Web プログラムはセッションを使用してデータを保存します。独立したセッション サーバーを使用すると、負荷分散シナリオでのセッション共有の問題を解決できます。セッションを使用する際のさまざまな経験とテクニックを紹介します

2.セッション、セッションID、Cookieについて
セッションデータはサーバー側に保存される必要があり、セッションIDはCookieに保存されます。ブラウザの有効期限が切れます

サーバーに送信される HTTP リクエストにはセッション ID が含まれており、サーバーはセッション ID に基づいてユーザーのセッション情報を取得します。これは、SessionID が Cookie に保存されるため、Cookie のサイズと数が原因で SessionID オブジェクトが発生しないように注意する必要があります。私たちのプログラムでは、SessionID Cookie は特別な処理を行います:

コードをコピーします コードは次のとおりです:
///
//// & LT;/Returns & GT;
HttpCookie SessionCookie = null; String SessionId = HttpContext.Current.Request.Cookies[ "ASP .NET_SessionId"].Value.ToString();
SessionCookie = new HttpCookie("ASP.NET_SessionId"); SessionCookie.Value = SessionId;
// 中間のコード部分を省略バックアップの SessionID のみを保持し、SessionID ロジックを取得します。 // cookieの総数が20を超えている場合、セッションが失われるのを防ぐために、asp.net_sessionidを書き直します。


三.搭建Session服务器的几种方式
将Session保存在独立的服务器中可以实现在多台Web服务器之间共享Session.虽然我们也可以自己开发Session存储系统, 但是使用ASP.NET自带的存储机制将更加便捷.
.NET提供了5种保存Seission的方式:

方式名称

存储方式 性能

Off

设置为不使用Session功能

InProc

设置为将Session存储在进程内,就是ASP中的存储方式,这是默认值。

性能最高

StateServer

设置为将Session存储在独立的状态服务中。通常是aspnet_state.exe进程.

性能损失10-15%

SQLServer

设置将Session存储在SQL Server中。

性能损失10-20%

Customer

自定制的存储方案

由实现方式确定

我们可以在Web.Config中配置程序使用的Session存储方式.默认情况下是InProc, 即保存在IIS进程中. 关于Off, InProc和Customer本文不做讲解. 相关文章大家都可以在网上搜索到.
下面主要讲解 StateServer 和 SQLServer 的应用.

四.使用 StateServer 模式搭建Session服务器
(1)服务器端配置
1.启动 Asp.net State service服务.(这个服务默认的状态为手动.修改为自动并启动.)
2.修改注册表: [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\aspnet_state\Parameters]
设置 AllowRemoteConnection = 1 , 设置 Port = 42424 (十进制,默认即为42424)
Port是服务的端口号
AllowRemoteConnection 表示是否允许其他机器连接,0为仅能本机使用,1为可以供其他机器使用.

(2)客户端设置
在Web应用程序的Web.Config中, 我们需要修改 / 节点.如果没有
没有则添加(默认使用的是InProc方式)

复制代码 代码如下:

mode="StateServer"
stateConnectionString="tcpip=服务器ip:42424"
cookieless="false"
timeout="60"/>

上面的参数我们可以根据需要修改.

五.使用SqlServer模式搭建Session服务器
(1)服务器端配置
使用SqlServer模式搭建Session服务器端有两种方式. ASP.NET 1.0和1.1版本请使用方式a, 2.0即以上版本请使用方式b.

a.使用SQL文件创建Session数据库
在ASP.NET 1.0和1.1 版本中, 只能使用这种方式.对于2.0及其以上版本,请使用aspnet_regsql.exe工具.(当然此方法也通用2.0版本)
.net提供了数据库安装脚本,可以在机器的windows文件夹中找到:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ InstallSqlState.sql
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ InstallSqlStateTemplate.sql
根据ASP.NET的版本不同, 需要使用不同的SQL脚本. ASP.NET主要有1.1和2.0两个版本,可以在不同的版本文件夹找到这两个SQL.
InstallSqlState.sql 是创建默认名称的数据库"[ASPState]".此SQL可以直接运行.
InstallSqlStateTemplate.sql 可以使用自己指定的数据库保存数据.此SQL需要自己修改后运行, 打开SQL文件将其中 [DatabaseNamePlaceHolder] 替换为自己指定的数据库名称.
执行installsqlstate.sql时不需要指定数据库,可以在任意数据库上执行.此SQL会自己创建新的数据库

b. 使用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 选项包括自定义数据库的名称。

(2)セッションクライアント設定
このルームでは、Web.Config の ノードを変更する必要もあります。デフォルトのデータベース (ASPState ライブラリ) が使用される場合、構成は次のようになります。
コードをコピーします

コードは次のとおりです: mode="SQLServer"
sqlConnectionString="server=192.168.9.151; uid=sa;"

カスタムのデータベース名を使用する場合また、allowCustomSqlDatabase 属性を指定し、データベース接続文字列でデータベースを指定する必要があります:


コードをコピーします

コードは次のとおりです:
mode="SQLServer"allowCustomSqlDatabase=" true"
s qlConnectionString= "server=192.168.9.151;pwd=123456;"

(1) StateServer モード:
1。 Web ファームに同じ があることを確認してください。
2. セッションに保存されるオブジェクトはシリアル化可能です。
3. Web ファーム内の異なる Web サーバーでセッション状態を維持するには、IIS メタベースの Web サイト アプリケーション パス (LMW3SVC2 など) がすべてのサーバーで一貫している必要があります (大文字と小文字が区別されます)。 Machine.Config で構成された HttpModuel モジュール。.NET インストール ディレクトリの Config フォルダーで Web.Config を表示します (バージョン 1.1 は Machine.Config にあります):


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


モジュールが存在します。
5. StateServer は負荷分散をサポートしていないため、同時実行性が高い場合は、SqlServer の高いパフォーマンスとセキュリティを享受できるように、SqlServer モードを使用することをお勧めします。ただし、ストレージ効率は低下します。
6. .Config の Machine Configuration で、コードをコピーします。


validationKey="123456789012345678901234567890AAAAAAAAAA" decryptionKey="12 3456789012345678901234567890123456789012345678" validation="SHA1" decryption="自動" />


(2)SqlServerモード:

1. セッションに保存されるオブジェクトシリアル化可能です。
2. デフォルトのデータベースを使用する場合、クライアント構成ファイル内のデータベース リンク文字列のユーザーは、ASPState および tempdb ライブラリに対する dbowner 権限を持っている必要があります。
3. SQLServer モードでは、SQL エージェントの完了によってセッションの有効期限が切れます。登録タスクを使用して、SQL エージェントが実行されていることを確認します。そうしないと、期限切れのセッション データをクリーンアップできず、データベース データが増加し続けることになります。
4. SqlServer モードを使用する場合は、Web ファーム内の各サーバーの ASP.NET アプリケーション パスが同じである必要があります。 Web ファーム内のすべての Web サーバーの IIS 構成データベース内の Web サイトのアプリケーション パスを同期します。 Web サイトへのアプリケーション パスでは大文字と小文字が区別されるため、大文字と小文字は同じである必要があります。
5. すべてのマシンの MachineKey は Machine.Config で同じにする必要があります:
コードをコピーします。 コードは次のとおりです:
validationKey="1234567890123456789012345678" 9012345678 90AAAAAAAAA"
復号化キー= = "123456789012345678901234567890123456789012345678"
検証 = "SHA1"
復号化 = "自動"
/>


(3)セッション:
1.セッションサーバーを介してASP.NETとASPの間でセッションを直接共有することはできません:
http://msdn.microsoft.com/zh-cn/ library/aa479313.aspx
2. セッションは、Web サイトの異なるアプリケーションまたは仮想ディレクトリ間で共有できません
3. セッションの有効期限はスライド時間です。
4. セッションは、.NET に付属する値の型を保存します。最高のパフォーマンス 優れています。オブジェクトを保存するとパフォーマンスが低下します。
(4)SessionID:
1.SessionID は URL に保存することもできます。Web.Config ファイルの System.Web/sessionState ノードの Cookiesless 属性を設定するだけです。
コードをコピーします コードは次のとおりです:

アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト「s」から「s」を「」から「s」から - から - - - - - - - - - - - - - - - - - - - - - - - - - セッションIDはユーザーのブラウザに保存されます。
3. ブラウザを閉じて再度アクセスすると、セッション ID が異なります。
4. IE6 ウィンドウを開くたびに、セッション ID が異なります。 IE6 で共有されます。
5. FireFox タブ ページと新しい FireFox ウィンドウのセッション ID は同じですが、フレームセット ページを含むセッションは
で共有できます。


コードをコピーします

コードは次のとおりです:
< Frame src="SessionID.aspx">



サフィックスが .htm で、.htm ファイルが渡されない場合ASP.NET ISAPI 処理後、サーバーの速度に応じて各フレーム ページに異なるセッション ID が生成され、更新後は最後のセッション ID と等しくなります。解決策は、.htm サフィックスを .aspx に変更するか、 .htm ファイルを ASP に転送します。

(5) Session_End イベント:
1. Session_End は InProc モードでのみ使用できます。
2. ブラウザを閉じると、Session_End はトリガーされません。 HTTP はステートレス プロトコルであるため、サーバーはブラウザが閉じられたかどうかを知る方法がありません。
3. Session_End は、セッションが期限切れになるか、Session.Abandon を呼び出した場合にのみトリガーされます。Session.Clear() はデータをクリアするだけで、セッションは削除されません。
4. Session_End はバックグラウンド スレッドによってトリガーされ、ワー​​カー プロセス アカウントを使用して実行されます。そのため、プログラムは、Session_End を使用してデータベースにアクセスするときに、許可の問題を考慮する必要があります。ワーカー プロセス (aspnet_wp.exe) これは、machine.config で指定できるアカウントで実行されます。したがって、Session_End では、整合性セキュリティを使用して SQL に接続すると、接続にワーカー プロセス アカウント ID が使用され、ログイン失敗が発生する可能性があります。6. Session_End は独立したスレッドによって開始されるため、HttpContext オブジェクトは使用できません。 Session_End (Request、Response、Server などのオブジェクトはすべて HttpContext 内にあります)、つまり、Response.Redirect や Server.Transfer などのメソッドは使用できません。

VII. 概要


私は SqlServer モードを使用して社内の複数のサーバーのセッション共有を実装しましたが、サーバーを再起動してもユーザーの予約プロセスは再開されません (予約プロセスに必要なセッションは失われません)。 ) この記事が特定のセッション サーバーのビルダーに役立つことを願っています


http://www.bkjia.com/PHPjc/327659.html
www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/327659.html

1. まとめ すべての Web プログラムはセッションを使用してデータを保存します。独立したセッション サーバーを使用すると、負荷分散シナリオにおけるセッション共有の問題を解決できます。...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート