应用程序池的失败设置 <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 的默认安装中。

操作方式

如何编辑快速失败保护配置设置

  1. 打开 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”。
  2. 在“连接”窗格中,展开服务器名称,单击“应用程序池”,然后单击要编辑的应用程序池
    Image of Connections pane displaying App Default Pool option highlighted.

  3. 在“操作”窗格中,单击“高级设置...”

  4. 在“高级设置”对话框中,单击要编辑的快速失败保护属性,对该对话框的属性值部分中的值进行编辑,然后单击“确定”。 例如,将“故障间隔(分钟)”更改为“4”,并将“最大故障数”更改为“4”
    Screenshot of Advanced Settings dialog box displaying Maximum Failures highlighted.

配置

特性

属性 说明
autoShutdownExe 可选的字符串属性。 指定要在 WWW 服务关闭应用程序池时运行的可执行文件。 可以使用 autoShutdownParams 属性将参数发送到可执行文件
autoShutdownParams 可选的字符串属性。 指定 autoShutdownExe 属性中指定的可执行文件的命令行参数
loadBalancerCapabilities 可选的枚举属性。 指定无法启动工作进程时(例如当请求队列已满或应用程序池处于快速故障保护状态时)对应的行为。 loadBalancerCapabilities 属性可以是以下可能值之一。 默认值为 HttpLevel

说明
HttpLevel 指定已返回 503 错误代码。 无法识别 HTTP 的负载均衡器不会切换到其他节点,因为 503 响应会告知负载均衡器计算机正常运行。

数值为 2

TcpLevel 指定 TCP 连接将终止。 使用不识别 HTTP 的负载均衡器时,这非常有用。

数值为 1

orphanActionExe 可选的字符串属性。 指定在 WWW 服务孤立某一工作进程时运行的可执行文件(如果 orphanWorkerProcess 属性设置为 true)。 可以使用 orphanActionParams 属性将参数发送到可执行文件
orphanActionParams 可选的字符串属性。 指示由 orphanActionExe 属性命名的可执行文件的命令行参数。 若要指定孤立进程的进程 ID,请使用 %1%。
orphanWorkerProcess 可选布尔属性。 指定是否将工作进程分配至孤立状态,而不是在应用程序池发生故障时终止它。

默认值为 false
rapidFailProtection 可选布尔属性。 如果设置为 true,则指示 WWW 服务在以下情况下从服务删除应用程序池中的所有应用程序:

  • 工作进程崩溃数已达到 rapidFailProtectionMaxCrashes 属性中指定的最大值
  • 崩溃发生在 rapidFailProtectionInterval 属性中指定的分钟数内
默认值为 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