다음을 통해 공유


애플리케이션 풀 <오류에 대한 오류 설정>

개요

<failure> 컬렉션에 있는 <applicationPools> 요소의 <add> 요소는 애플리케이션 풀이 실패할 때 수행할 작업을 구성합니다. 요소의 <failure>autoShutdownExe, orphanActionExe, rapidFailProtection 특성은 애플리케이션 문제를 해결하거나 디버깅할 때 특히 유용할 수 있습니다. 애플리케이션이 실패를 기록하거나 디버그하기 위해 외부 실행 파일을 실행하는 등 애플리케이션이 실패할 때 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. 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(인터넷 정보 서비스) 관리자를 두 번 클릭합니다.
  2. 연결 창에서 서버 이름을 확장하고 애플리케이션 풀을 클릭한 다음 편집할 애플리케이션 풀을 클릭합니다.
    앱 기본 풀 옵션이 강조 표시된 연결 창 이미지

  3. 작업 창에서 고급 설정...을 클릭합니다.

  4. 고급 설정 대화 상자에서 편집할 빠른 실패 보호 속성을 클릭한 다음 대화 상자의 속성 값 섹션에서 값을 편집한 다음 확인을 클릭합니다. 예를 들어 실패 간격(분)4 로, 최대 실패를4로 변경합니다.
    최대 실패가 강조 표시된 고급 설정 대화 상자의 스크린샷

구성

특성

attribute Description
autoShutdownExe 선택적 문자열 특성입니다. WWW 서비스가 애플리케이션 풀을 종료할 때 실행할 실행 파일을 지정합니다. autoShutdownParams 특성을 사용하여 실행 파일에 매개 변수를 보낼 수 있습니다.
autoShutdownParams 선택적 문자열 특성입니다. autoShutdownExe 특성에 지정된 실행 파일에 대한 명령줄 매개 변수를 지정합니다.
loadBalancerCapabilities 선택적 열거형 특성입니다. 요청 큐가 가득 차거나 애플리케이션 풀이 빠른 실패 보호 상태인 경우와 같이 작업자 프로세스를 시작할 수 없는 경우의 동작을 지정합니다. loadBalancerCapabilities 특성은 다음과 같은 가능한 값 중 하나일 수 있습니다. 기본값은 HttpLevel입니다.

Description
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 특성입니다. 프로세스의 실패 횟수가 다시 설정되기까지의 시간(분)을 지정합니다.

기본값은 (5분)입니다 00:05:00 .
rapidFailProtectionMaxCrashes 선택적 uint 특성입니다. rapidFailProtectionInterval 특성에 지정된 시간(분) 내에 허용되는 최대 오류 수를 지정합니다. 참고: IIS 7.5부터 이 값은 1에서 2147483647 사이여야 합니다.

기본값은 5입니다.

자식 요소

없음

구성 샘플

다음 구성 샘플은 DefaultAppPool이라는 단일 애플리케이션 풀에 대해 신속한 오류 보호를 사용하도록 설정하고, 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