アプリケーション プールのプロセス モデルの設定 <processModel>
概要
<processModel>
要素を使用すると、IIS 7 以降でのアプリケーション プールのセキュリティ、パフォーマンス、正常性、信頼性の機能の多くを構成できます。 これらには、次のものが含まれます。
- アプリケーション プール ID。これは、アプリケーション プールのワーカー プロセスが実行されるサービスまたはユーザー アカウントの名前です。 これは identityType 属性で定義されます。 既定では、IIS 7.5 以降より、アプリケーション プールは、Windows プロセス アクティブ化サービス (WAS) によって動的に作成される組み込みの ApplicationPoolIdentity アカウントで実行されます。 (IIS 7.0 では、既定の ID は NetworkService アカウントでした)。identityType 属性値は、組み込みの NetworkService アカウント、LocalService アカウント、組み込みの LocalSystem アカウント、または作成したカスタム アカウントに変更できます。 カスタム アカウントを選択する場合は、userName および password 属性を使用してアカウント資格情報を定義します。 ただし、NetworkService、LocalService、LocalSystem アカウントには、 ApplicationPoolIdentity アカウントよりも高いユーザー権限があることに注意してください。 (警告: 高レベルのユーザー権限を使用してアプリケーション プールを実行することは重大なセキュリティ リスクとなります。)さらに、logonType 属性を使用して、プロセス ID がバッチ ユーザーまたはサービスとしてログオンする必要があるかどうかを指定できます。 (ログオンの種類の詳細については、LogonUser 関数に関する記事を参照してください)。
- Web ガーデニングと Non-Uniform Memory Access (NUMA) ハードウェアの使用。これは maxProcesses 属性を設定して構成できます。 Web ガーデニングについては、maxProcesses を 1 より大きい値に設定します。 NUMA ハードウェアの使用については、maxProcesses を値 "0" に設定して、IIS では NUMA ノードにあるのと同じ数のワーカー プロセスを実行するように指定します。
- アイドル タイムアウト設定。ワーカー プロセスがシャットダウンするまでアイドル状態を維持する期間を設定できます。 この設定を構成するには、idleTimeout 属性を編集します。
- ワーカー プロセスに対する ping の有効化による正常性を監視、ワーカー プロセスが ping に応答できる最大時間、正常性を監視するためにワーカー プロセスに送信される ping の頻度。 これらの設定を構成するには、pingingEnabled、pingInterval、pingResponseTime 属性を編集します。
- ワーカー プロセスのシャットダウンと起動時間の制限。 最初の制限は shutdownTimeLimit 属性によって設定され、WWW サービスがワーカー プロセスを終了する前に、ワーカー プロセスがすべての要求を完了するために IIS 7 以降によって与えられる間隔が決定されます。 2 番目の制限は startupTimeLimit 属性によって設定され、IIS 7 以降でアプリケーション プールを起動できる時間を指定します。
互換性
バージョン | メモ |
---|---|
IIS 10.0 | <processModel> 要素は、IIS 10.0 では変更されませんでした。 |
IIS 8.5 | idleTimeoutAction 属性が追加され、idleTimeout 属性の期間中アイドル状態のワーカー プロセスが、ただ終了したというわけではなく、終了または中断のいずれかの状態になります。 |
IIS 8.0 | setProfileEnvironment 属性が追加され、新しいプロセスに対するユーザー プロファイルに基づいて環境を設定できるようになりました。 Non-Uniform Memory Access (NUMA) のサポートを含む、 maxProcesses 属性の値が追加されました。 プロセスで実行されたアクションがログに記録されるように指定するために、logEventOnProcessModel 属性が追加されました。 |
IIS 7.5 | <add> 要素の <processModel> 要素が IIS 7.5 で更新され、新しい ApplicationPoolIdentity を使用してアプリケーションを実行し、プロセス ID のログインの種類を指定できる設定が含まれました。 |
IIS 7.0 | <processModel> 要素が IIS 7.0 で導入されました。 |
IIS 6.0 | <processModel> 要素は、IIS 6.0 IIsApplicationPools メタベース オブジェクトの一部の設定を置き換えます。 |
段取り
<applicationPools>
コレクションは、IIS 7 以降の既定のインストールに含まれています。
操作方法
プロセス モデルの構成設定を編集する方法
インターネット インフォメーション サービス (IIS) マネージャーを開きます。
Windows Server 2012 または Windows Server 2012 R2 を使用している場合:
- タスク バーで、[サーバー マネージャー] をクリックし、[ツール]、[インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
Windows 8 または Windows 8.1 を使用している場合:
- Windows キーを押しながら文字 X を押し、[コントロール パネル] をクリックします。
- [管理ツール] をクリックし、[インターネット インフォメーション サービス (IIS) マネージャー] をダブルクリックします。
Windows Server 2008 または Windows Server 2008 R2 を使用している場合:
- タスク バーで、[スタート] ボタンをクリックし、[管理ツール]、[インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
Windows Vista または Windows 7 を使用している場合:
- タスク バーで、[スタート]、[コントロール パネル] の順にクリックします。
- [管理ツール] をダブルクリックし、[インターネット インフォメーション サービス (IIS) マネージャー] をダブルクリックします。
[接続] ウィンドウで、サーバー名を展開し、[アプリケーション プール] をクリックし、編集するアプリケーション プールをクリックします。
[操作] ウィンドウの [詳細設定...] をクリックします。
[詳細設定] ダイアログ ボックスで、編集するプロセス モデル プロパティをクリックし、ダイアログ ボックスのプロパティ値セクションでこれを編集して [OK] をクリックします。 たとえば、[Shutdown Time Limit (seconds)] (シャットダウン時間制限 (秒)) と [Startup Time Limits (seconds)] (スタートアップ時間制限 (秒)) を 30 に変更します。
Non-Uniform Memory Access (NUMA) ハードウェアで使用するように IIS を構成する方法
インターネット インフォメーション サービス (IIS) マネージャーを開きます。
Windows Server 2012 以降を使用している場合:
- タスク バーで、[サーバー マネージャー]、[ツール]、[インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
Windows 8 以降を使用している場合:
- Windows キーを押しながら文字 X を押し、次に [コントロール パネル] をクリックします。
- [管理ツール] をクリックし、[インターネット インフォメーション サービス (IIS) マネージャー] をダブルクリックします。
[接続] ウィンドウでサーバー名を展開し、[アプリケーション プール] をクリックします。
[アプリケーション プール] ウィンドウで、NUMA 用に構成するプールを選択します。
[アクション] ウィンドウで、[詳細設定] を選びます。
[プロセス モデル] ウィンドウで、[最大ワーカー プロセス数] を
0
に設定します。
アイドル タイムアウト アクションを構成する方法
インターネット インフォメーション サービス (IIS) マネージャーを開きます。
Windows Server 2012 R2 を使用している場合:
- タスク バーで、[サーバー マネージャー] をクリックし、[ツール]、[インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
Windows 8.1 を使用している場合:
- Windows キーを押しながら文字 X を押し、[コントロール パネル] をクリックします。
- [管理ツール] をクリックし、[インターネット インフォメーション サービス (IIS) マネージャー] をダブルクリックします。
[接続] ウィンドウで、サーバー名をダブルクリックし、[アプリケーション プール] をダブルクリックし、構成するアプリケーション プールを選びます。
[操作] ウィンドウの [詳細設定] をクリックします。
[詳細設定] ダイアログボックスの [プロセス モデル] セクションで、[idleTimeoutAction] として [Terminate] (終了) または [Suspend] (中断) を選択します。
OK をクリックします。
構成
<processModel>
要素は、ApplicationHost.config ファイルにサーバー レベルで構成します。
属性
属性 | 説明 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
identityType |
省略可能な列挙型属性。 アプリケーション プールを実行するアカウント ID を指定します。 注: IIS 7.5 以降では、既定値は ApplicationPoolIdentity です。 (IIS 7.0 では、既定値は NetworkService でした。)identityType 属性には、次の使用可能な値の 1 つを指定できます。既定値は NetworkService です。
|
||||||||||||
idleTimeout |
省略可能な timeSpan 属性。 新しい要求が受信されず、ワーカー プロセスが要求を処理していない場合に、ワーカー プロセスをアイドル状態で実行する時間 (分単位) を指定します。 割り当てられた時間が経過すると、ワーカー プロセスでは WWW サービスによるシャットダウンを要求する必要があります。 既定値は 00:20:00 です。 アイドル タイムアウト機能を無効にするには、この値を 00:00:00 に設定します。 |
||||||||||||
idleTimeoutAction |
省略可能な列挙型属性。 アイドル タイムアウト期間に達したときに実行するアクションを指定します。 IIS 8.5 より前では、 idleTimeout 属性の期間中アイドル状態だったワーカー プロセスは終了します。 IIS 8.5 以降では、idleTimeout の制限に達したワーカー プロセスを終了するか、メモリからディスクに移動して中断するかの選択が可能です。 プロセスを中断する方が、終了するよりも時間がかからず、メモリ消費が少なくなる可能性があります。アプリケーション初期化の偽の要求を使用して、中断のアイドル タイムアウト アクションを構成できます ( applicationInitialization を参照してください。idleTimeoutAction 属性には次の値を指定できます。 既定値は Terminate です。
|
||||||||||||
loadUserProfile |
省略可能な Boolean 属性です。 IIS でアプリケーション プール ID のユーザー プロファイルを読み込むかどうかを指定します。 この値を false に設定すると、IIS は IIS 6.0 の動作に戻ります。 IIS 6.0 では、アプリケーション プール ID のユーザー プロファイルは読み込まれません。 既定値は false です。 |
||||||||||||
logEventOnProcessModel |
省略可能なフラグ属性。 イベント ビューアーに記録される、プロセス中に実行されたアクションを指定します。 IIS 8.0 では、該当するアクションはアイドル タイムアウト アクションのみです。このアクションでは、プロセスが idleTimeout 期間アイドル状態であったためにプロセスが終了します。 フラグ名は IdleTimeout と等しくなります。 値は 1 です。既定値は IdleTimeout です。 |
||||||||||||
logonType |
省略可能な列挙型属性。 プロセス ID のログオンの種類を指定します。 (ログオンの種類の詳細については、LogonUser 関数に関する記事を参照してください)。 注: この属性は IIS 7.5 で導入されました。 logonType 属性には、次のいずれかの値を指定できます。既定値は LogonBatch です。
|
||||||||||||
manualGroupMembership |
省略可能な Boolean 属性です。 IIS_IUSRS グループのセキュリティ識別子 (SID) をワーカー プロセス トークンに追加するかどうかを指定します。 false の場合、IIS ではアプリケーション プール ID が、必要なファイルとシステム リソースにアクセスできる組み込みの IIS_IUSRS グループのメンバーである場合と同様に、アプリケーション プール ID を自動的に使用します。 true の場合、ワーカー プロセスの実行時に必要となるすべてのリソースにアプリケーション プール ID を明示的に追加する必要があります。 既定値は false です。 |
||||||||||||
maxProcesses |
省略可能な uint 属性。 アプリケーション プールに使用されるワーカー プロセスの最大数を示します。
1 です。 |
||||||||||||
password |
省略可能な文字列属性。 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 秒) です。 |
||||||||||||
requestQueueDelegatorIdentity |
省略可能で、 String 型の属性。 HTTP 要求をアプリケーション プールに委任するアクセス許可を持つアカウント ID を指定します。 注: この属性は、インターネット インフォメーション サービス (IIS) マネージャー UI では使用できません。 |
||||||||||||
setProfileEnvironment |
省略可能な Boolean 属性です。 setProfileEnvironment が True に設定されている場合、WAS ではワーカー プロセスの作成時に CreateProcessAsUser に渡す環境ブロックが作成されます。 これにより、新しいプロセスのユーザー プロファイルに基づいて環境が設定されます。既定値は True です。 |
||||||||||||
shutdownTimeLimit |
省略可能な timeSpan 属性。 W3SVC サービスで、リサイクルが開始された後のサービスの待機時間を指定します。 ワーカー プロセスが shutdownTimeLimit 以内にシャットダウンしない場合、W3SVC サービスによって終了されます。 既定値は 00:01:30 (1 分 30 秒) です。 |
||||||||||||
startupTimeLimit |
省略可能な timeSpan 属性。 IIS でアプリケーション プールの起動を待機する時間を指定します。 アプリケーション プールが startupTimeLimit 以内に起動しない場合は、ワーカー プロセスは終了し、ラピッド フェール保護カウントがインクリメントされます。 既定値は 00:01:30 (1 分 30 秒) です。 |
||||||||||||
userName |
省略可能な文字列属性。 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
Note
AppCmd.exe を使用してこれらの設定を構成するときは、commit パラメーターを必ず apphost
に設定する必要があります。 これで、ApplicationHost.config ファイルの適切な場所セクションに構成設定がコミットされます。
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 IsNull(value) Then
value = CStr(value)
End If
If Not value = CStr(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