應用程式集 <區 processModel 的進程模型設定>

概觀

您可以使用 <processModel> 元素,在 IIS 7 和更新版本上設定應用程式集區的許多安全性、效能、健康情況和可靠性功能。 包括下列功能:

  • 應用程式集區身分識別,這是應用程式集區背景工作進程執行所在的服務或使用者帳戶名稱。 這是由 identityType 屬性所定義。 根據預設,從 IIS 7.5 開始,應用程式集區會在內建 ApplicationPoolIdentity 帳戶下執行,這是由 Windows Process Activation Service (WAS) 動態建立。 (IIS 7.0 中,預設身分識別是 NetworkService 帳戶。) 您可以將 identityType 屬性值變更為內建 NetworkService 帳戶、 LocalService 帳戶、內建 LocalSystem 帳戶,或您所建立的自定義帳戶。 如果您選擇自定義帳戶,請使用 userNamepassword 屬性來定義帳戶認證。 不過請注意, NetworkServiceLocalServiceLocalSystem 帳戶具有比 ApplicationPoolIdentity 帳戶更多的用戶權力。 (警告:使用高階使用者權力執行應用程式集區是嚴重的安全性風險。) 此外,您可以使用 logonType 屬性來指定進程識別是否應該以批次使用者或服務身分登入。 (如需登入類型的其他資訊,請參閱 LogonUser函 式文章.)
  • Web 樹系和使用非統一記憶體存取 (NUMA) 硬體,您可以藉由設定 maxProcesses 屬性來設定。 如需Web花色,請參閱 maxProcesses 的值大於一。 若要使用 NUMA 硬體,請將 maxProcesses 設定為 “0” 值,以指定 IIS 執行與 NUMA 節點相同的背景工作進程數目。
  • 閑置逾時設定,可讓您設定背景工作進程在關閉之前保持閑置的時間長度。 編輯 idleTimeout 屬性以設定此設定。
  • 藉由對背景工作進程啟用 Ping、允許背景工作進程回應 Ping 的時間上限,以及傳送給背景工作進程來監視其健康情況的 Ping 頻率,藉此監視健康情況。 編輯 pingingEnabledpingIntervalpingResponseTime 屬性來設定這些設定。
  • 背景工作進程關機和啟動時間限制。 第一個限制是由 shutdownTimeLimit 屬性所設定,並決定 IIS 7 和更新版本的間隔,讓背景工作進程在 WWW 服務終止背景工作進程之前完成所有要求。 第二個限制是由 startupTimeLimit 屬性所設定,並指定 IIS 7 和更新版本允許啟動應用程式集區的時間量。

相容性

版本 備註
IIS 10.0 未在 IIS 10.0 中修改專案 <processModel>
IIS 8.5 idleTimeoutAction 新增 屬性,讓在屬性持續 idleTimeout 期間閑置的背景工作進程終止或暫停,而不只是終止。
IIS 8.0 setProfileEnvironment已新增 屬性,可讓環境根據新進程的使用者配置檔進行設定。 已為 屬性新增 maxProcesses 值,包括支援非統一記憶體存取 (NUMA) 。 logEventOnProcessModel已新增 屬性,以指定進程所採取的動作會記錄。
IIS 7.5 元素 <processModel><add> 元素已在 IIS 7.5 中更新,以包含可讓您使用新的 ApplicationPoolIdentity 執行應用程式的設定,並指定進程識別的登入類型。
IIS 7.0 元素 <processModel> 是在 IIS 7.0 中引進。
IIS 6.0 元素 <processModel> 會取代 IIS 6.0 IIsApplicationPools Metabase 物件中的某些設定。

設定

集合 <applicationPools> 包含在 IIS 7 和更新版本的預設安裝中。

作法

如何編輯進程模型組態設定

  1. 開啟 [Internet Information Services (IIS) 管理員

    • 如果您使用 Windows Server 2012 或 Windows Server 2012 R2:

      • 在任務欄上,依序按兩下 [伺服器管理員]、[工具],然後按兩下 [Internet Information Services (IIS) 管理員]。
    • 如果您使用 Windows 8 或 Windows 8.1:

      • 按住 Windows 鍵,按字母 X,然後按兩下 [控制台]。
      • 單擊 [系統管理工具],然後按兩下 [ Internet Information Services (IIS) Manager]。
    • 如果您使用 Windows Server 2008 或 Windows Server 2008 R2:

      • 在任務欄上,按兩下 [ 開始],指向 [ 系統管理工具],然後按兩下 [ Internet Information Services (IIS) 管理員]。
    • 如果您使用 Windows Vista 或 Windows 7:

      • 在任務欄上,按兩下 [開始],然後按兩下 [控制台]。
      • 按兩下 [系統管理工具],然後按兩下 [ Internet Information Services] (IIS) Manager
  2. 在 [ 連線] 窗格中,展開伺服器名稱,按兩下 [ 應用程式集區],然後按下您要編輯的應用程式集區。 顯示 [應用程式集區] 頁面的 [I I S Manager] 視窗螢幕快照。

  3. 在 [ 動作 ] 窗格中,按兩下 [ 進階設定...]

  4. 在 [ 進階設定] 對話框中,按下您要編輯的進程模型屬性,然後在對話框的 [屬性值] 區段中加以編輯,然後按兩下 [ 確定]。 例如,將 [關機時間限制] (秒) ],並將 [啟動時間限制] (秒) 變更為 30
    [進階設定] 對話框的螢幕快照。[行程模型] 已醒目提示。

如何設定 IIS 以搭配非統一記憶體存取 (NUMA) 硬體使用

  1. 開啟 [Internet Information Services (IIS) 管理員

    • 如果您使用 Windows Server 2012 或更新版本:

      • 在任務欄上,依序按兩下 [伺服器管理員]、[工具],然後按兩下 [Internet Information Services (IIS) 管理員]。
    • 如果您使用 Windows 8 或更新版本:

      • 按住 Windows 鍵,按字母 X,然後按兩下 [控制台]。
      • 單擊 [系統管理工具],然後按兩下 [ Internet Information Services (IIS) Manager]。
  2. 在 [ 連線] 窗格中,展開伺服器名稱,然後按下 [ 應用程式集區]。

  3. 在 [ 應用程式集區 ] 窗格中,選取您要為 NUMA 設定的集區。

  4. 在 [ 動作 ] 窗格中,選取 [ 進階設定]。

  5. [行程模型] 窗格底下,將 [背景工作進程上限 ] 設定為 0

    [進階設定] 窗格的螢幕快照。清單中反白顯示 [背景工作進程上限]。

如何設定閑置逾時動作

  1. 開啟 [Internet Information Services (IIS) 管理員

    • 如果您使用 Windows Server 2012 R2:

      • 在任務欄上,依序按兩下 [伺服器管理員]、[工具],然後按兩下 [Internet Information Services (IIS) 管理員]。
    • 如果您使用 Windows 8.1:

      • 按住 Windows 鍵,按字母 X,然後按兩下 [控制台]。
      • 單擊 [系統管理工具],然後按兩下 [ Internet Information Services (IIS) Manager]。
  2. 在 [ 連線] 窗格中,按兩下伺服器名稱,按兩下 [應用程式集區],然後選取要設定的應用程式集區。

  3. 在 [ 動作 ] 窗格中,按兩下 [ 進階設定]。

  4. 在 [進階設定] 對話框的 [處理模型] 區段中,針對 idleTimeoutAction,選取 [終止] 或 [暫停]。

  5. 按一下 [確定]。

    [進階設定] 對話框的螢幕快照。[閑置逾時- 動作] 會反白顯示,並在下拉功能表中選取 [終止]。

設定

<processModel>您可以在 ApplicationHost.config 檔案的伺服器層級設定 元素。

屬性

屬性 Description
identityType 選擇性列舉屬性。

指定應用程式集區執行所在的帳戶身分識別。

注意: 從 IIS 7.5 開始,預設值為 ApplicationPoolIdentity。 (IIS 7.0 中,預設值為 NetworkService.)

identityType 屬性可以是下列其中一個可能的值;預設值為 NetworkService

Description
ApplicationPoolIdentity 指定應用程式集區是在動態建立的應用程式集區身分識別帳戶下執行。 從 IIS 7.5 開始, ApplicationPoolIdentity 是執行應用程式集區的預設身分識別。 (在 IIS 7.0 中,預設身分識別為 NetworkService.)

當應用程式集區在帳戶下 ApplicationPoolIdentity 執行時,應用程式集區會以 「IIS AppPool<」 的形式存取資源;AppPool>“ 身分識別。 例如,針對 “DefaultAppPool”,身分識別為 “IIS AppPool\DefaultAppPool”。 此身分識別可讓系統管理員指定只與應用程式集區執行所在身分識別相關的許可權,進而提高伺服器安全性。

數值為 4
LocalService 指定應用程式集區是在內建 LocalService 帳戶下執行,其用戶權力與 NetworkService 相同。

當應用程式集區在 LocalService 帳戶下執行時,應用程式集區會在網路上顯示匿名認證。

注意: 在具有高階用戶權力的帳戶下執行應用程式集區是嚴重的安全性風險。

數值為 1
LocalSystem 指定應用程式集區在內建 LocalSystem 帳戶下執行,此帳戶具有本機電腦上的廣泛許可權,並作為網路上的電腦。

注意: 在具有高階用戶權力的帳戶下執行應用程式集區是嚴重的安全性風險。

數值為 0
NetworkService 指定應用程式集區是在內建 NetworkService 帳戶下執行。 在 IIS 7.0 中,這是執行應用程式集區的預設身分識別;IIS 7.5 中的預設值已變更為 ApplicationPoolIdentity

當應用程式集區在 NetworkService 帳戶下執行時,應用程式集區會以電腦帳戶的形式存取網路資源。

數值為 2
SpecificUser 指定應用程式集區在自定義身分識別下執行,這是使用 userNamepassword 屬性所設定。

注意: 若要避免在組態檔中儲存未加密的密碼字串,請一律使用 AppCmd.exe 或 IIS 管理員來輸入密碼。 如果您使用這些管理工具,密碼字串會在將密碼字串寫入 XML 組態檔之前自動加密。 這比儲存未加密的密碼提供更好的密碼安全性。

注意: 受控服務帳戶可用來啟用服務和工作來共用自己的網域帳戶,以及啟用自動密碼管理,而不需要系統管理員手動管理密碼。 如需詳細資訊,請參閱 受控服務帳戶的新功能

數值為 3
idleTimeout 選擇性的 timeSpan 屬性。

指定如果未收到任何新要求且背景工作進程未處理要求,) 背景工作進程應該在幾分鐘內執行閑置 (的時間長度。 經過配置的時間之後,背景工作進程應該要求由 WWW 服務將其關閉。

預設值是 00:20:00

若要停用閒置逾時功能,請將此值設定為 00:00:00
idleTimeoutAction 選擇性列舉屬性。

指定達到閑置逾時期間時要執行的動作。 在 IIS 8.5 之前,屬性持續時間 idleTimeout 閑置的背景工作進程將會終止。 在 IIS 8.5 之後,您可以選擇終止達到 idleTimeout 限制的背景工作進程,或將它從記憶體移至磁碟來暫停它。 暫停進程可能需要較少的時間,並耗用比終止它少的記憶體。

您可以使用應用程式初始化的假要求來設定暫停的閒置逾時動作, (請參閱 applicationInitialization

屬性 idleTimeoutAction 可以有下列可能的值。 預設值是 Terminate
Description
Terminate 終止閑置的背景工作進程。 當使用者後續存取網站並啟動背景工作進程時,這需要較長的啟動期間。

數值為 0
Suspend 暫停閑置的背景工作進程。 這會使背景工作進程保持運作,但從記憶體移至磁碟,以減少耗用的系統資源。 後續要求傳入時,記憶體管理員會將要求所需的分頁檔案從磁碟載入記憶體,可能會讓背景工作進程比先前終止時更快。

數值為 1
loadUserProfile 選擇性的 Boolean 屬性。

指定 IIS 是否載入應用程式集區身分識別的使用者配置檔。 將此值設定為 false 會導致 IIS 還原為 IIS 6.0 行為。 IIS 6.0 不會載入應用程式集區身分識別的使用者配置檔。

預設值是 false
logEventOnProcessModel 選擇性旗標屬性。

指定處理程式中所採取的動作會記錄到 事件檢視器。 在 IIS 8.0 中,唯一適用的動作是閑置逾時動作,其中進程會因為 idleTimeout 期間處於閑置狀態而終止。

旗標名稱等於 IdleTimeout。 值為 1

預設值是 IdleTimeout
logonType 選擇性列舉屬性。

指定進程識別的登入類型。 (如需登入類型的其他資訊,請參閱 LogonUser函 式文章.)

注意: 這個屬性是在 IIS 7.5 中引進的。

屬性 logonType 可以是下列其中一個可能的值;預設值為 LogonBatch
Description
LogonBatch 指定應用程式集區身分識別應該以批次使用者身分登入。

數值為 0
LogonService 指定應用程式集區身分識別應該以服務身分登入。

數值為 1
manualGroupMembership 選擇性的 Boolean 屬性。

指定是否將IIS_IUSRS群組安全性標識子 (SID) 新增至背景工作進程令牌。 若 為 false,IIS 會自動使用應用程式集區身分識別,就像它是內建IIS_IUSRS群組的成員,可存取必要的檔案和系統資源。 若 為 true,應用程式集區身分識別必須明確新增至背景工作進程在運行時間需要的所有資源。

預設值是 false
maxProcesses 選擇性 uint 屬性。

指出將用於應用程式集區的背景工作進程數目上限。
  • 值為 「1」 表示應用程式集區的單一背景工作進程上限。 這會是沒有 NUMA 節點之伺服器上的設定。
  • 值為 「2」 或更多表示 Web 樹狀結構,必要時會針對應用程式集區使用多個背景工作進程 () 。
  • 值為 “0” 會指定 IIS 執行與 NUMA) 節點有非統一記憶體存取 (相同數目的背景工作進程。 IIS 會識別硬體上可用的 NUMA 節點數目,並啟動相同數目的背景工作進程。 例如,如果您有四個NUMA節點,它最多會針對該應用程式集區使用四個背景工作進程。 在此範例中,將 maxProcesses 設定為 「0」 或 「4」 的值會有相同的結果。
預設值是 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 要求委派給應用程式集區的帳戶識別。

注意:Internet Information Services (IIS) Manager 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 選擇性字串屬性。

指定當 identityTypeSpecificUser 時,應用程式集區執行所在的身分識別。

子元素

無。

組態範例

下列組態範例會使用應用程式集 <add> 區元素來建立名為 Contoso 的新應用程式集區。 元素 <recycling> 會設定應用程式集區重新啟動的記錄、 <periodicRestart> 專案會在應用程式集區重新啟動時設定,而 <processModel> 元素會設定 shutdownTimeLimitstartupTimeLimit 屬性,以關閉應用程式集區中的背景工作進程,每 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

注意

當您使用 AppCmd.exe 來設定這些設定時,請務必將 認可 參數 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