アプリケーション プールのプロセス モデル設定 <processModel>
- 概要
- 互換性
- セットアップ
- 方法
- 構成
- サンプル コード
※本ページに挿入されている画像をクリックすると、画像全体が別ウィンドウで表示されます。
概要
<processModel>
要素を使用すると、インターネット インフォメーション サービス (IIS) 7.0 上のアプリケーション プールのセキュリティ、パフォーマンス、健全性、および信頼性に関する多くの機能を構成できます。構成できる機能には、次のものがあります。
- アプリケーション プール ID。これは、アプリケーション プールのワーカー プロセスが実行されるサービスまたはユーザー アカウントの名前です。この ID は identityType 属性によって定義されます。既定では、アプリケーション プールは NetworkService ビルトイン アカウントで実行されます。identityType 属性値は、LocalService ビルトイン アカウント、LocalSystem ビルトイン アカウント、または独自に作成したカスタム アカウントに変更できます。カスタム アカウントを選択する場合は、userName 属性と password 属性を使用してアカウントの資格情報を定義します。LocalService アカウントと LocalSystem アカウントには NetworkService アカウントよりも多くのユーザー権限が付与されていることに注意してください。高レベルのユーザー権限を使用してアプリケーション プールを実行すると、重大なセキュリティ上のリスクが伴います。
- Web ガーデン。これは maxProcesses 属性を 1 より大きい値に設定することで構成できます。
- アイドル タイムアウト設定。ワーカー プロセスがシャットダウンされるまでのアイドル時間を設定できます。この設定を構成するには、idleTimeout 属性を編集します。
- 健全性の監視。ワーカー プロセスに対する ping の有効化、ワーカー プロセスが ping に応答するまでの最大許容時間、およびワーカー プロセスに送信される ping の頻度を設定することで、ワーカー プロセスの健全性を監視します。これらの設定を構成するには、pingingEnabled 属性、pingInterval 属性、および pingResponseTime 属性を編集します。
- ワーカー プロセスのシャットダウンと起動の時間制限。シャットダウンの時間制限は shutdownTimeLimit 属性によって設定され、WWW サービスによってワーカー プロセスが終了される前に、すべての要求を完了するために IIS 7.0 がワーカー プロセスに許容する時間を決定します。起動の時間制限は startupTimeLimit 属性によって設定され、アプリケーション プールが起動されるまでに IIS 7.0 が許容する時間を指定します。
互換性
IIS 7.0 | IIS 6.0 | |
---|---|---|
説明 | <processModel> は IIS 7.0 で新たに導入された要素です。 |
|
セットアップ
<applicationPools>
コレクションは、IIS 7.0 の既定のインストールに含まれています。
方法
プロセス モデルの構成設定の編集方法
タスク バーの [スタート] ボタンをクリックして、[管理ツール] をポイントし、[インターネット インフォメーション サービス (IIS) マネージャー] をクリックします。
[接続] ウィンドウで対象のサーバー名を展開して、[アプリケーション プール] をクリックし、編集するアプリケーション プールをクリックします。
[操作] ウィンドウで [詳細設定] をクリックします。
[詳細設定] ダイアログ ボックスで、編集するプロセス モデルのプロパティをクリックし、ダイアログ ボックスのプロパティ値のセクションで値を編集して、[OK] をクリックします。たとえば、 [シャットダウンの制限時間 (秒)] と [起動の制限時間 (秒)] を 30 に変更します。
構成
サーバー レベルの <processModel>
要素は、ApplicationHost.config ファイルで構成できます。
属性
属性 | 説明 |
---|---|
identityType |
オプションの enum 属性。 アプリケーション プールを実行するアカウントの ID を指定します。 identityType 属性には、次のいずれかの値を指定できます。既定値は NetworkService です。--------------------------------------------------------------------------------------------------------- 値: LocalService 説明:
値: LocalSystem 説明:
値: NetworkService 説明:
値: SpecificUser 説明:
|
idleTimeout |
オプションの timeSpan 属性。 新しい要求を受信せず、ワーカー プロセスが要求を処理していない場合に、ワーカー プロセスがアイドル状態のまま実行される時間を分で指定します。割り当てられた時間が経過すると、ワーカー プロセスは WWW サービスによるシャットダウンを要求します。 既定値は 00:20:00 です。 |
loadUserProfile |
オプションの Boolean 属性。 IIS がアプリケーション プール ID のユーザー プロファイルを読み込むかどうかを指定します。この値を false に設定すると、IIS 6.0 の動作と同じになります。IIS 6.0 では、アプリケーション プール ID のユーザー プロファイルは読み込まれません。 既定値は false です。 |
manualGroupMembership |
オプションの Boolean 属性。 IIS_IUSRS グループのセキュリティ識別子 (SID) をワーカー プロセスのトークンに追加するかどうかを指定します。false を指定した場合、アプリケーション プール ID は、必要なファイルおよびシステム リソースにアクセス可能なビルトインの IIS_IUSRS グループのメンバーであると自動的に見なされます。true を指定した場合、ワーカー プロセスが実行時に必要なすべてのリソースにアクセスするためのアプリケーション プール ID を明示的に追加する必要があります。 既定値は false です。 |
maxProcesses |
オプションの uint 属性。 アプリケーション プールに関連付けられるワーカー プロセスの数を指定します。1 以外の値は Web ガーデンになることを意味します。 既定値は 1 です。 |
password |
オプションの string 属性。 userName 属性に関連付けられるパスワードを指定します。この属性は、identityType の値が SpecificUser である場合にのみ必要になります。 注 : 暗号化されていないパスワード文字列が構成ファイルに保存されないようにするために、必ず AppCmd.exe または IIS マネージャーを使用してパスワードを入力してください。これらの管理ツールを使用すると、パスワード文字列は自動的に暗号化されてから XML 構成ファイルに書き込まれます。そのため、暗号化されていないパスワードを保存するよりも、パスワードのセキュリティが強化されます。 |
pingingEnabled |
オプションの Boolean 属性。 ワーカー プロセスで ping を有効にするかどうかを指定します。 既定値は true です。 |
pingInterval |
オプションの timeSpan 属性。 WWW サービスがワーカー プロセスに送信する健全性監視用の ping の間隔を指定します。 既定値は 00:00:30 (30 秒) です。 |
pingResponseTime |
オプションの timeSpan 属性。 ワーカー プロセスが健全性監視用の ping に応答するまでの許容時間を指定します。制限時間を超過すると、WWW サービスはワーカー プロセスを終了します。 既定値は 00:01:30 (1 分 30 秒) です。 |
shutdownTimeLimit |
オプションの timeSpan 属性。 W3SVC サービスがリサイクルの開始後に待機する時間を指定します。ワーカー プロセスが shutdownTimeLimit の時間内にシャットダウンしない場合、そのワーカー プロセスは W3SVC サービスによって終了されます。 既定値は 00:01:30 (1 分 30 秒) です。 |
startupTimeLimit |
オプションの timeSpan 属性。 アプリケーション プールが起動するまで IIS が待機する時間を指定します。アプリケーション プールが startupTimeLimit の時間内に起動しない場合は、ワーカー プロセスが終了され、ラピッド フェール保護カウントが加算されます。 既定値は 00:01:30 (1 分 30 秒) です。 |
userName |
オプションの string 属性。 identityType が SpecificUser の場合にアプリケーション プールを実行する ID を指定します。 |
子要素
なし。
構成サンプル
次の構成サンプルでは、アプリケーション プールの <add>
要素を使用して、Contoso という名前の新しいアプリケーション プールを作成します。<recycling>
要素は、アプリケーション プールの再起動のログ記録を構成します。<periodicRestart>
要素は、アプリケーション プールの再起動時の条件を構成します。<processModel>
要素は、アプリケーション プール内のワーカー プロセスのシャットダウンと起動に関する shutdownTimeLimit 属性および startupTimeLimit 属性をそれぞれ 30 秒に構成します。この時間制限を超えると、IIS はワーカー プロセスを終了します。
<add name="Contoso">
<recycling logEventOnRecycle="Schedule">
<periodicRestart>
<schedule>
<clear />
<add value="03:00:00" />
</schedule>
</periodicRestart>
</recycling>
<processModel identityType="NetworkService" shutdownTimeLimit="00:00:30" startupTimeLimit="00:00:30" />
</add>
サンプル コード
次の例では、Contoso という名前のアプリケーション プールの processModel.shutdownTimeLimit と processModule.startupTimeLimit のプロパティ値をそれぞれ 30 秒に変更します。
AppCmd.exe
appcmd.exe set apppool "Contoso" /processModel.shutdownTimeLimit:00:00:30
appcmd.exe set apppool "Contoso" /processModel.startupTimeLimit:00:00:30
次の構文を使用することもできます。
appcmd.exe set config -section:system.applicationHost/applicationPools /[name='Contoso'].processModel.shutdownTimeLimit:"00:00:30" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /[name='Contoso'].processModel.startupTimeLimit:"00:00:30" /commit:apphost
C#
using System;
using System.Text;
using Microsoft.Web.Administration;
internal static class Sample
{
private static void Main()
{
using (ServerManager serverManager = new ServerManager())
{
Configuration config = serverManager.GetApplicationHostConfiguration();
ConfigurationSection applicationPoolsSection = config.GetSection("system.applicationHost/applicationPools");
ConfigurationElementCollection applicationPoolsCollection = applicationPoolsSection.GetCollection();
ConfigurationElement addElement = FindElement(applicationPoolsCollection, "add", "name", @"Contoso");
if (addElement == null) throw new InvalidOperationException("Element not found!");
ConfigurationElement processModelElement = addElement.GetChildElement("processModel");
processModelElement["shutdownTimeLimit"] = TimeSpan.Parse("00:00:30");
processModelElement["startupTimeLimit"] = TimeSpan.Parse("00:00:30");
serverManager.CommitChanges();
}
}
private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues)
{
foreach (ConfigurationElement element in collection)
{
if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase))
{
bool matches = true;
for (int i = 0; i < keyValues.Length; i += 2)
{
object o = element.GetAttributeValue(keyValues[i]);
string value = null;
if (o != null)
{
value = o.ToString();
}
if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase))
{
matches = false;
break;
}
}
if (matches)
{
return element;
}
}
}
return null;
}
}
VB.NET
Imports System
Imports System.Text
Imports Microsoft.Web.Administration
Module Sample
Sub Main()
Dim serverManager As ServerManager = New ServerManager
Dim config As Configuration = serverManager.GetApplicationHostConfiguration
Dim applicationPoolsSection As ConfigurationSection = config.GetSection("system.applicationHost/applicationPools")
Dim applicationPoolsCollection As ConfigurationElementCollection = applicationPoolsSection.GetCollection
Dim addElement As ConfigurationElement = FindElement(applicationPoolsCollection, "add", "name", "Contoso")
If (addElement Is Nothing) Then
Throw New InvalidOperationException("Element not found!")
End If
Dim processModelElement As ConfigurationElement = addElement.GetChildElement("processModel")
processModelElement("shutdownTimeLimit") = TimeSpan.Parse("00:00:30")
processModelElement("startupTimeLimit") = TimeSpan.Parse("00:00:30")
serverManager.CommitChanges()
End Sub
Private Function FindElement(ByVal collection As ConfigurationElementCollection, ByVal elementTagName As String, ByVal ParamArray keyValues() As String) As ConfigurationElement
For Each element As ConfigurationElement In collection
If String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase) Then
Dim matches As Boolean = True
Dim i As Integer
For i = 0 To keyValues.Length - 1 Step 2
Dim o As Object = element.GetAttributeValue(keyValues(i))
Dim value As String = Nothing
If (Not (o) Is Nothing) Then
value = o.ToString
End If
If Not String.Equals(value, keyValues((i + 1)), StringComparison.OrdinalIgnoreCase) Then
matches = False
Exit For
End If
Next
If matches Then
Return element
End If
End If
Next
Return Nothing
End Function
End Module
JavaScript
var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";
var applicationPoolsSection = adminManager.GetAdminSection("system.applicationHost/applicationPools", "MACHINE/WEBROOT/APPHOST");
var applicationPoolsCollection = applicationPoolsSection.Collection;
var addElementPos = FindElement(applicationPoolsCollection, "add", ["name", "Contoso"]);
if (addElementPos == -1) throw "Element not found!";
var addElement = applicationPoolsCollection.Item(addElementPos);
var processModelElement = addElement.ChildElements.Item("processModel");
processModelElement.Properties.Item("shutdownTimeLimit").Value = "00:00:30";
processModelElement.Properties.Item("startupTimeLimit").Value = "00:00:30";
adminManager.CommitChanges();
function FindElement(collection, elementTagName, valuesToMatch) {
for (var i = 0; i < collection.Count; i++) {
var element = collection.Item(i);
if (element.Name == elementTagName) {
var matches = true;
for (var iVal = 0; iVal < valuesToMatch.length; iVal += 2) {
var property = element.GetPropertyByName(valuesToMatch[iVal]);
var value = property.Value;
if (value != null) {
value = value.toString();
}
if (value != valuesToMatch[iVal + 1]) {
matches = false;
break;
}
}
if (matches) {
return i;
}
}
}
return -1;
}
VBScript
Set adminManager = createObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"
Set applicationPoolsSection = adminManager.GetAdminSection("system.applicationHost/applicationPools", "MACHINE/WEBROOT/APPHOST")
Set applicationPoolsCollection = applicationPoolsSection.Collection
addElementPos = FindElement(applicationPoolsCollection, "add", Array("name", "Contoso"))
If siteElementPos = -1 Then
WScript.Echo "Element not found!"
WScript.Quit
End If
Set addElement = applicationPoolsCollection.Item(addElementPos)
Set processModelElement = addElement.ChildElements.Item("processModel")
processModelElement.Properties.Item("shutdownTimeLimit").Value = "00:00:30"
processModelElement.Properties.Item("startupTimeLimit").Value = "00:00:30"
adminManager.CommitChanges()
Function FindElement(collection, elementTagName, valuesToMatch)
For i = 0 To CInt(collection.Count) - 1
Set element = collection.Item(i)
If element.Name = elementTagName Then
matches = True
For iVal = 0 To UBound(valuesToMatch) Step 2
Set Property = element.GetPropertyByName(valuesToMatch(iVal))
value = property.Value
If Not value = Null Then
value = CStr(value)
End If
If Not value = valuesToMatch(iVal + 1) Then
matches = False
Exit For
End If
Next
If matches Then
Exit For
End If
End If
Next
If matches Then
FindElement = i
Else
FindElement = -1
End If
End Function