アプリケーション プールのプロセス モデル設定 <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 で新たに導入された要素です。

<processModel> 要素は、IIS 6.0 の IIsApplicationPools メタベース オブジェクトの一部の設定に代わるものです。

セットアップ

<applicationPools> コレクションは、IIS 7.0 の既定のインストールに含まれています。

方法

プロセス モデルの構成設定の編集方法

  1. タスク バーの [スタート] ボタンをクリックして、[管理ツール] をポイントし、[インターネット インフォメーション サービス (IIS) マネージャー] をクリックします。

  2. [接続] ウィンドウで対象のサーバー名を展開して、[アプリケーション プール] をクリックし、編集するアプリケーション プールをクリックします。

    拡大

  3. [操作] ウィンドウで [詳細設定] をクリックします。

  4. [詳細設定] ダイアログ ボックスで、編集するプロセス モデルのプロパティをクリックし、ダイアログ ボックスのプロパティ値のセクションで値を編集して、[OK] をクリックします。たとえば、 [シャットダウンの制限時間 (秒)][起動の制限時間 (秒)]30 に変更します。

    拡大

構成

サーバー レベルの <processModel> 要素は、ApplicationHost.config ファイルで構成できます。

属性

属性 説明
identityType オプションの enum 属性。

アプリケーション プールを実行するアカウントの ID を指定します。

identityType 属性には、次のいずれかの値を指定できます。既定値は NetworkService です。

---------------------------------------------------------------------------------------------------------

値: LocalService

説明:

  • アプリケーション プールが LocalService ビルトイン アカウントで実行されるように指定します。このアカウントは NetworkService と同じユーザー権限を持っています。
    アプリケーション プールが LocalService アカウントで実行される場合、このアプリケーション プールはネットワーク上では匿名の認証を持ちます。
  • 数値は 1 です。

値: LocalSystem

説明:

  • アプリケーション プールが LocalSystem ビルトイン アカウントで実行されるように指定します。このアカウントはローカル コンピューター上で広範囲な特権を保有し、ネットワーク上のコンピューターとして機能します。
    注 : 高レベルのユーザー権限を持つアカウントでアプリケーション プールを実行すると、重大なセキュリティ上のリスクが伴います。
  • 数値は 0 です。

値: NetworkService

説明:

  • アプリケーション プールが NetworkService ビルトイン アカウントで実行されるように指定します。これは、アプリケーション プールを実行する際の既定のビルトイン アカウントです。
    アプリケーション プールが NetworkService アカウントで実行される場合、このアプリケーション プールはネットワーク リソースにコンピューター アカウントとしてアクセスします。
  • 数値は 2 です。

値: SpecificUser

説明:

  • アプリケーション プールがカスタム ID で実行されるように指定します。カスタム ID は、userName 属性と password 属性を使用して構成します。
    注 : 暗号化されていないパスワード文字列が構成ファイルに保存されないようにするために、必ず AppCmd.exe または IIS マネージャーを使用してパスワードを入力してください。これらの管理ツールを使用すると、パスワード文字列は自動的に暗号化されてから XML 構成ファイルに書き込まれます。そのため、暗号化されていないパスワードを保存するよりも、パスワードのセキュリティが強化されます。
  • 数値は 3 です。
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 属性。

identityTypeSpecificUser の場合にアプリケーション プールを実行する 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.shutdownTimeLimitprocessModule.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