應用程式集 <區 processModel 的進程模型設定>
概觀
您可以使用 <processModel>
元素,在 IIS 7 和更新版本上設定應用程式集區的許多安全性、效能、健康情況和可靠性功能。 包括下列功能:
- 應用程式集區身分識別,這是應用程式集區背景工作進程執行所在的服務或使用者帳戶名稱。 這是由 identityType 屬性所定義。 根據預設,從 IIS 7.5 開始,應用程式集區會在內建 ApplicationPoolIdentity 帳戶下執行,這是由 Windows Process Activation Service (WAS) 動態建立。 (IIS 7.0 中,預設身分識別是 NetworkService 帳戶。) 您可以將 identityType 屬性值變更為內建 NetworkService 帳戶、 LocalService 帳戶、內建 LocalSystem 帳戶,或您所建立的自定義帳戶。 如果您選擇自定義帳戶,請使用 userName 和 password 屬性來定義帳戶認證。 不過請注意, NetworkService、 LocalService 和 LocalSystem 帳戶具有比 ApplicationPoolIdentity 帳戶更多的用戶權力。 (警告:使用高階使用者權力執行應用程式集區是嚴重的安全性風險。) 此外,您可以使用 logonType 屬性來指定進程識別是否應該以批次使用者或服務身分登入。 (如需登入類型的其他資訊,請參閱 LogonUser函 式文章.)
- Web 樹系和使用非統一記憶體存取 (NUMA) 硬體,您可以藉由設定 maxProcesses 屬性來設定。 如需Web花色,請參閱 maxProcesses 的值大於一。 若要使用 NUMA 硬體,請將 maxProcesses 設定為 “0” 值,以指定 IIS 執行與 NUMA 節點相同的背景工作進程數目。
- 閑置逾時設定,可讓您設定背景工作進程在關閉之前保持閑置的時間長度。 編輯 idleTimeout 屬性以設定此設定。
- 藉由對背景工作進程啟用 Ping、允許背景工作進程回應 Ping 的時間上限,以及傳送給背景工作進程來監視其健康情況的 Ping 頻率,藉此監視健康情況。 編輯 pingingEnabled、 pingInterval 和 pingResponseTime 屬性來設定這些設定。
- 背景工作進程關機和啟動時間限制。 第一個限制是由 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 和更新版本的預設安裝中。
作法
如何編輯進程模型組態設定
開啟 [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。
在 [ 連線] 窗格中,展開伺服器名稱,按兩下 [ 應用程式集區],然後按下您要編輯的應用程式集區。
在 [ 動作 ] 窗格中,按兩下 [ 進階設定...]
在 [ 進階設定] 對話框中,按下您要編輯的進程模型屬性,然後在對話框的 [屬性值] 區段中加以編輯,然後按兩下 [ 確定]。 例如,將 [關機時間限制] (秒) ],並將 [啟動時間限制] (秒) 變更為 30。
如何設定 IIS 以搭配非統一記憶體存取 (NUMA) 硬體使用
開啟 [Internet Information Services (IIS) 管理員:
如果您使用 Windows Server 2012 或更新版本:
- 在任務欄上,依序按兩下 [伺服器管理員]、[工具],然後按兩下 [Internet Information Services (IIS) 管理員]。
如果您使用 Windows 8 或更新版本:
- 按住 Windows 鍵,按字母 X,然後按兩下 [控制台]。
- 單擊 [系統管理工具],然後按兩下 [ Internet Information Services (IIS) Manager]。
在 [ 連線] 窗格中,展開伺服器名稱,然後按下 [ 應用程式集區]。
在 [ 應用程式集區 ] 窗格中,選取您要為 NUMA 設定的集區。
在 [ 動作 ] 窗格中,選取 [ 進階設定]。
在 [行程模型] 窗格底下,將 [背景工作進程上限 ] 設定為
0
。
如何設定閑置逾時動作
開啟 [Internet Information Services (IIS) 管理員:
如果您使用 Windows Server 2012 R2:
- 在任務欄上,依序按兩下 [伺服器管理員]、[工具],然後按兩下 [Internet Information Services (IIS) 管理員]。
如果您使用 Windows 8.1:
- 按住 Windows 鍵,按字母 X,然後按兩下 [控制台]。
- 單擊 [系統管理工具],然後按兩下 [ Internet Information Services (IIS) Manager]。
在 [ 連線] 窗格中,按兩下伺服器名稱,按兩下 [應用程式集區],然後選取要設定的應用程式集區。
在 [ 動作 ] 窗格中,按兩下 [ 進階設定]。
在 [進階設定] 對話框的 [處理模型] 區段中,針對 idleTimeoutAction,選取 [終止] 或 [暫停]。
按一下 [確定]。
設定
<processModel>
您可以在 ApplicationHost.config 檔案的伺服器層級設定 元素。
屬性
屬性 | Description | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
identityType |
選擇性列舉屬性。 指定應用程式集區執行所在的帳戶身分識別。 注意: 從 IIS 7.5 開始,預設值為 ApplicationPoolIdentity。 (IIS 7.0 中,預設值為 NetworkService .) identityType 屬性可以是下列其中一個可能的值;預設值為 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 是否載入應用程式集區身分識別的使用者配置檔。 將此值設定為 false 會導致 IIS 還原為 IIS 6.0 行為。 IIS 6.0 不會載入應用程式集區身分識別的使用者配置檔。 預設值是 false 。 |
||||||||||||
logEventOnProcessModel |
選擇性旗標屬性。 指定處理程式中所採取的動作會記錄到 事件檢視器。 在 IIS 8.0 中,唯一適用的動作是閑置逾時動作,其中進程會因為 idleTimeout 期間處於閑置狀態而終止。 旗標名稱等於 IdleTimeout 。 值為 1 。預設值是 IdleTimeout 。 |
||||||||||||
logonType |
選擇性列舉屬性。 指定進程識別的登入類型。 (如需登入類型的其他資訊,請參閱 LogonUser函 式文章.) 注意: 這個屬性是在 IIS 7.5 中引進的。 屬性 logonType 可以是下列其中一個可能的值;預設值為 LogonBatch 。
|
||||||||||||
manualGroupMembership |
選擇性的 Boolean 屬性。 指定是否將IIS_IUSRS群組安全性標識子 (SID) 新增至背景工作進程令牌。 若 為 false,IIS 會自動使用應用程式集區身分識別,就像它是內建IIS_IUSRS群組的成員,可存取必要的檔案和系統資源。 若 為 true,應用程式集區身分識別必須明確新增至背景工作進程在運行時間需要的所有資源。 預設值是 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 要求委派給應用程式集區的帳戶識別。 注意: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 |
選擇性字串屬性。 指定當 identityType 為 SpecificUser 時,應用程式集區執行所在的身分識別。 |
子元素
無。
組態範例
下列組態範例會使用應用程式集 <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
注意
當您使用 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