애플리케이션 풀 <오류에 대한 오류 설정>
개요
<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의 기본 설치에 포함됩니다.
방법
빠른 장애 방지 구성 설정을 편집하는 방법
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(인터넷 정보 서비스) 관리자를 두 번 클릭합니다.
작업 창에서 고급 설정...을 클릭합니다.
고급 설정 대화 상자에서 편집할 빠른 실패 보호 속성을 클릭한 다음 대화 상자의 속성 값 섹션에서 값을 편집한 다음 확인을 클릭합니다. 예를 들어 실패 간격(분) 을 4 로, 최대 실패를4로 변경합니다.
구성
특성
attribute | Description | ||||||
---|---|---|---|---|---|---|---|
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 특성입니다. 프로세스의 실패 횟수가 다시 설정되기까지의 시간(분)을 지정합니다. 기본값은 (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