应用程序池的失败设置 <failure>
概述
<applicationPools>
集合中的 <add>
元素的 <failure>
元素可配置应用程序池失败时采取的操作。 <failure>
元素的 autoShutdownExe、orphanActionExe 和 rapidFailProtection 属性在排除故障或调试应用程序时特别有用,因为它们能够灵活地指定 Internet Information Services (IIS) 在应用程序失败时将采取的操作,例如运行外部可执行文件来记录或调试故障。
兼容性
版本 | 说明 |
---|---|
IIS 10.0 | <failure> 元素在 IIS 10.0 中未进行修改。 |
IIS 8.5 | <failure> 元素在 IIS 8.5 中未进行修改。 |
IIS 8.0 | <failure> 元素在 IIS 8.0 中未进行修改。 |
IIS 7.5 | <failure> 元素未在 IIS 7.5 中进行修改。 |
IIS 7.0 | <failure> 元素是在 IIS 7.0 中引入的。 |
IIS 6.0 | <failure> 元素替换了 IIS 6.0 IIsApplicationPools 元数据库属性的部分内容。 |
安装
<applicationPools>
集合包含在 IIS 7 的默认安装中。
操作方式
如何编辑快速失败保护配置设置
打开 Internet Information Services (IIS) Manager:
如果使用的是 Windows Server 2012 或 Windows Server 2012 R2:
- 在任务栏上,单击“服务器管理器”,单击“工具”,然后单击“Internet Information Services (IIS) Manager”。
如果使用的是 Windows 8 或 Windows 8.1:
- 按住 Windows 键,按字母 X,然后单击“控制面板”。
- 单击“管理工具”,然后双击“Internet Information Services (IIS) Manager”。
如果使用的是 Windows Server 2008 或 Windows Server 2008 R2:
- 在任务栏上,单击“开始”,指向“管理工具”,然后单击“Internet Information Services (IIS) Manager”。
如果使用的是 Windows Vista 或 Windows 7:
- 在任务栏上,单击“开始”,然后单击“控制面板”。
- 双击“管理工具”,然后双击“Internet Information Services (IIS) Manager”。
在“操作”窗格中,单击“高级设置...”
在“高级设置”对话框中,单击要编辑的快速失败保护属性,对该对话框的属性值部分中的值进行编辑,然后单击“确定”。 例如,将“故障间隔(分钟)”更改为“4”,并将“最大故障数”更改为“4”。
配置
特性
属性 | 说明 | ||||||
---|---|---|---|---|---|---|---|
autoShutdownExe |
可选的字符串属性。 指定要在 WWW 服务关闭应用程序池时运行的可执行文件。 可以使用 autoShutdownParams 属性将参数发送到可执行文件。 | ||||||
autoShutdownParams |
可选的字符串属性。 指定 autoShutdownExe 属性中指定的可执行文件的命令行参数。 | ||||||
loadBalancerCapabilities |
可选的枚举属性。 指定无法启动工作进程时(例如当请求队列已满或应用程序池处于快速故障保护状态时)对应的行为。 loadBalancerCapabilities 属性可以是以下可能值之一。 默认值为 HttpLevel 。
|
||||||
orphanActionExe |
可选的字符串属性。 指定在 WWW 服务孤立某一工作进程时运行的可执行文件(如果 orphanWorkerProcess 属性设置为 true)。 可以使用 orphanActionParams 属性将参数发送到可执行文件。 | ||||||
orphanActionParams |
可选的字符串属性。 指示由 orphanActionExe 属性命名的可执行文件的命令行参数。 若要指定孤立进程的进程 ID,请使用 %1%。 | ||||||
orphanWorkerProcess |
可选布尔属性。 指定是否将工作进程分配至孤立状态,而不是在应用程序池发生故障时终止它。 默认值为 false 。 |
||||||
rapidFailProtection |
可选布尔属性。 如果设置为 true,则指示 WWW 服务在以下情况下从服务删除应用程序池中的所有应用程序:
true 。 |
||||||
rapidFailProtectionInterval |
可选的 timeSpan 属性。 指定重置进程的失败计数之前的分钟数。 默认值为 00:05:00 (5 分钟)。 |
||||||
rapidFailProtectionMaxCrashes |
可选 uint 属性。 指定 rapidFailProtectionInterval 属性指定的分钟数内允许的最大失败数。 注意:从 IIS 7.5 开始,此值必须介于 1 到 2147483647 之间。 默认值为 5 。 |
子元素
无。
配置示例
以下配置示例为名为 DefaultAppPool 的单个应用程序池启用快速故障保护、配置 5 分钟的快速故障保护间隔,并将这 5 分钟内的最大故障数设置为 5。
<applicationPools>
<add name="DefaultAppPool">
<failure rapidFailProtection="true"
rapidFailProtectionInterval="00:05:00"
rapidFailProtectionMaxCrashes="5" />
</add>
<applicationPoolDefaults>
<processModel identityType="NetworkService" />
</applicationPoolDefaults>
</applicationPools>
代码示例
以下代码示例为服务器上的 DefaultAppPool 启用快速故障保护,然后将保护间隔设置为 5 分钟,并将最大崩溃次数设置为 5。
AppCmd.exe
appcmd.exe set config -section:system.applicationHost/applicationPools /[name='DefaultAppPool'].failure.rapidFailProtection:"True" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /[name='DefaultAppPool'].failure.rapidFailProtectionInterval:"00:05:00" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /[name='DefaultAppPool'].failure.rapidFailProtectionMaxCrashes:"5" /commit:apphost
注意
使用 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", @"DefaultAppPool");
if (addElement == null) throw new InvalidOperationException("Element not found!");
ConfigurationElement failureElement = addElement.GetChildElement("failure");
failureElement["rapidFailProtection"] = true;
failureElement["rapidFailProtectionInterval"] = TimeSpan.Parse("00:05:00");
failureElement["rapidFailProtectionMaxCrashes"] = 5;
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", "DefaultAppPool")
If (addElement Is Nothing) Then
Throw New InvalidOperationException("Element not found!")
End If
Dim failureElement As ConfigurationElement = addElement.GetChildElement("failure")
failureElement("rapidFailProtection") = True
failureElement("rapidFailProtectionInterval") = TimeSpan.Parse("00:05:00")
failureElement("rapidFailProtectionMaxCrashes") = 5
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", "DefaultAppPool"]);
if (addElementPos == -1) throw "Element not found!";
var addElement = applicationPoolsCollection.Item(addElementPos);
var failureElement = addElement.ChildElements.Item("failure");
failureElement.Properties.Item("rapidFailProtection").Value = true;
failureElement.Properties.Item("rapidFailProtectionInterval").Value = "00:05:00";
failureElement.Properties.Item("rapidFailProtectionMaxCrashes").Value = 5;
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 = WScript.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", "DefaultAppPool"))
If (siteElementPos = -1) Then
WScript.Echo "Element not found!"
WScript.Quit
End If
Set addElement = applicationPoolsCollection.Item(addElementPos)
Set failureElement = addElement.ChildElements.Item("failure")
failureElement.Properties.Item("rapidFailProtection").Value = true
failureElement.Properties.Item("rapidFailProtectionInterval").Value = "00:05:00"
failureElement.Properties.Item("rapidFailProtectionMaxCrashes").Value = 5
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