IIS 7.5 응용 프로그램 웜-업 모듈 시작하기

등록일시: 2009-11-16 15:27,  수정일시: 2013-11-27 10:04
조회수: 8,886
이 문서는 IIS 기술을 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.

서론 *

윈도우 서버 2008 R2나 윈도우 7과 함께 제공되는 IIS 7.5에는 무거운 웹 응용 프로그램을 미리 초기화해서 준비해 놓을 수 있는 새로운 기능이 포함되어 있습니다. 일반적으로 이런 무거운 웹 응용 프로그램들은 필요에 따라 요청이 전달되기 전에 미리 캐시를 비롯한 그 밖의 데이터 구조들을 최적의 형태로 준비해 둘 필요가 있으며, 이때 수행되는 초기화 작업의 대표적인 예로는 다음과 같은 작업들이 있습니다:

  • 데이터 구조들의 초기화
  • 저장소의 데이터를 메모리에 적재하기 (캐싱)
  • 코드 컴파일, 예 .NET 응용 프로그램
  • 데이터베이스 연결 얻기

이런 작업들에 대한 웜 업이 필요한 이유는 첫 번째 요청에 대한 초기화가 진행되는 동안 최종 사용자들이 느린 응답을 받게 되므로 사용자 경험이 나빠지기 때문입니다. 심지어 어떤 경우에는, 웹 응용 프로그램들이 갑작스럽게 쏟아지는 요청들을 처리할 수 없어서 적절한 웜 업 없이는 정상적인 속도가 나지 않을 수도 있습니다. 그러나, 이제 이런 웹 응용 프로그램들을 지원하기 위한 IIS 7.5 응용 프로그램 웜 업 모듈이 등장했습니다.

IIS 7.5 응용 프로그램 웜 업 모듈을 이용하면 특정 웹 응용 프로그램에 대한 사용자의 요청이 IIS에 전달되기 전에, 미리 자동으로 실행되는 URL들의 모음을 관리자들이나 웹 응용 프로그램 개발자들이 구성할 수 있습니다. 그리고, 구성된 웜 업 URL들이 실행됨에 따라 데이터 구조들과 캐시들이 초기화되어, 네크워크로부터 도착한 요청들은 초기화에 따른 어떤한 지연도 겪지 않게 됩니다. **

* 공교롭게도 원문을 번역해서 올리는 동안 IIS.net (http://www.iis.net/)의 디자인 레이아웃과 원문의 내용이 일부 갱신되었습니다. 그러나, 내용상 별다른 차이는 없으므로 본문의 번역을 수정하지는 않을 것입니다.

** 요점을 정리해보면 이렇습니다. 초기화 작업을 수행하는 코드를 특정 ASPX 페이지에 미리 작성해두고, 이 페이지를 웜 업 모듈에 등록해 놓으면, 해당 웹 응용 프로그램에 대한 첫 번째 요청이 들어오기 전에 웜 업 모듈이 알아서 이 페이지를 한 번 수행해준다는 간단한 개념입니다. 즉, 사람 대신 웜 업 모듈이 미리 페이지를 한 번 호출해준다고 생각하면 됩니다.

아키텍처

IIS는 이른바 IIS 작업자 프로세스라고 알려진 특정 프로세스를 이용해서 웹 요청들을 처리합니다. 그리고, 하나 이상의 웹 응용 프로그램이 이 작업자 프로세스 내에서 실행될 수 있기 때문에 IIS 전문 용어로 이 프로세스를 응용 프로그램 풀이라고 부르기도 합니다. 일반적으로 신뢰성에 대한 요구 때문에 응용 프로그램 풀의 수명은 비교적 짧은 편인데, 가령 응용 프로그램 풀은 필요한 경우에는 언제라도 IIS 관리 서비스(WAS, IIS Admin Service)에 의해서 재생될 수 있습니다. 또한, 시스템 자원을 절약하기 위해서 필요한 경우에만 응용 프로그램 풀이 시작되는데, 호스팅하고 있는 웹 응용 프로그램에 대한 요청이 전달된 경우에만 시스템이 IIS 작업자 프로세스를 생성합니다.

바로 이런 아키텍처로 인해서, 시스템이 다시 시작되는 경우처럼 IIS가 시작되는 경우뿐만 아니라 IIS가 특정 응용 프로그램 풀을 재생하는 경우 등에도 매번 초기화 비용이 발생하게 됩니다. 그러나, IIS 응용 프로그램 웜 업 모듈을 이용하면 IIS 응용 프로그램 풀이 WAS에게 네트워크로부터 요청을 받을 준비가 되었다는 통보를 전달하기 전에 미리 초기화를 완료시킬 수 있습니다.

응용 프로그램 풀 재생중의 웜 업

재생이 진행되는 동안에도 새로운 작업자 프로세스가 웜 업 과정을 마무리 할 때 까지는 셧 다운을 요구받은 기존의 작업자 프로세스에서 요청들을 처리하게 됩니다. 새로운 작업자 프로세스는 웜 업이 완료된 뒤에만 비로서 WAS에게 요청을 받을 준비가 되었다고 통보합니다. 그러면, WAS는 새로운 작업자 프로세스가 준비완료되었다는 통보를 받는 즉시 기존 작업자 프로세스를 셧 다운시킵니다.

서비스 재시작 후의 웜 업

또한, 시스템이 다시 시작된 경우처럼 IIS W3SVC 서비스가 시작된 직후에 응용 프로그램 풀이 웜 업돼야 하는 경우에도 웜 업 모듈이 좋은 해결방안이 될 수 있습니다. 응용 프로그램 풀 노드에는 startMode라는 이름의 새로운 구성 설정 속성이 추가되었습니다. 이 startMode 속성값이 "Always"로 설정되어 있으면(기본값은 "OnDemand" 입니다), 응용 프로그램 풀이 곧바로 시작되고 구성되어 있는 웜 업 URL들이 실행됩니다.

전제조건

웜 업 모듈을 이용하기 위해서는 마이크로소프트 윈도우 7이나 윈도우 서버 2008 R2와 함께 제공되는 IIS 7.5가 필요합니다. 본문의 과정들을 따라해보려면 IIS 7.5를 전체 설치하는 것이 가장 바람직합니다.

그리고, 본문의 따라하기 과정들을 실습해보려면 IIS 7.5 설치의 일부로 ASP.NET이 반드시 설치되어 있어야 합니다. IIS 7.5를 설치하는 방법은 여기를 참고하시기 바랍니다.

응용 프로그램 웜 업 모듈 설치하기

IIS 응용 프로그램 웜 업 모듈은 http://www.iis.net/downloads/microsoft/application-initialization에서 다운로드 받으실 수 있습니다.

모든 설치 과정을 마치고 나면 IIS 7.5 시스템에 응용 프로그램 웜 업 모듈이 추가될 것입니다. 그리고, IIS의 사용자 인터페이스도 확장됩니다. 따라서, IIS 관리자를 사용해서 웜 업 모듈을 구성할 수도 있습니다.

모듈 이용하기

응용 프로그램 웜 업 모듈을 사용해보기에 앞서 먼저 "warmed-up"이라는 이름으로 샘플 응용 프로그램을 생성해보도록 하겠습니다. 본문의 따라하기에서는 파워쉘을 이용해서 이 작업을 수행합니다. 지금부터 살펴볼 대부분의 과정들은 시스템에 ASP.NET과 IIS 파워쉘 스냅인이 설치되어 있다는 가정을 전제로 합니다. IIS 7.5를 전체 설치했다면 이 조건은 자연스럽게 만족될 것입니다.

데모 웜 업 응용 프로그램 생성 단계

  1. 먼저 파워쉘 세션을 시작합니다. "시작" 메뉴로 가서 "모든 프로그램"을 클릭한 다음, "보조프로그램"을 클릭하고 "Windows Powershell"을 클릭한 다음, "Windows Powershell" 아이콘을 클릭합니다.
  2. 그리고, 현재 파워쉘 세션에 IIS 파워쉘 스냅인을 추가합니다:
    Import-Module WebAdministration
    만약, 이 작업이 보안 예외를 발생시키면서 실패한다면 아마도 실행 정책을 보다 덜 제한적으로 설정해야 할 것입니다. 보다 자세한 정보는 "Set-ExecutionPolicy" 커멘드릿에 대한 도움말을 참고하시기 바랍니다.
  3. 지금부터 IIS의 구성 설정을 일부 변경할 것이므로 현재의 구성 설정을 백업해두는 것이 좋습니다. 다음과 같은 커멘트릿을 실행하면 IIS 의 현재 구성 설정을 백업할 수 있습니다:
    Backup-WebConfiguration BeforeAppWarmupWalkthrough
    나중에 구성 설정을 복원할 때는 간단히 다음의 커멘드릿을 실행하십시오.
    Restore-WebConfiguration BeforeAppWarmupWalkthrough
  4. 다음 명령을 사용해서 응용 프로그램의 루트 폴더를 생성합니다:
    New-Item c:\inetpub\WarmUpTest -type Directory
  5. 이제 Default Web Site에 새로운 응용 프로그램을 추가합니다.
    New-WebApplication -site 'Default Web Site' -name WarmUpTest -physicalpath c:\inetpub\WarmUpTest
  6. 그리고, 이 응용 프로그램을 위한 ASPX 페이지가 하나 필요하므로 다음 단계로 파워쉘의 "Here-String"을 이용해서 코드 파일을 추가합니다. 이 코드는 현재 시간과 작업자 프로세스 ID를 출력하는 페이지를 반환합니다. 무엇 때문에 이런 기능이 필요한지는 나중에 알게 될 것입니다. *
    $txt = @"
    <%@ Page Language="C#" %>
    <%@ import Namespace="System.Diagnostics" %>
    <script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        DateTime time = DateTime.Now;
        Response.Write(String.Format("Time: {0}:{1}:{2}", time.Hour, time.Minute, time.Second) +
            "\tCurrent process: " + Process.GetCurrentProcess().Id.ToString());
    }
    </script>
    
    <html>
    <head>
        <title>ASP.NET Simple Page</title>
    </head>
    <body bgcolor="#FFFFFF">
        <p><asp:label id="Message" runat="server" /></p>
    </body>
    </html>
    "@
  7. 이제 다음 명령을 사용해서 이 코드를 코드 파일로 저장합니다.
    New-Item c:\inetpub\WarmUpTest\default.aspx -type file -value $txt
  8. Get-WebUrl 커멘트릿을 사용해서 방금 만든 응용 프로그램이 정상적으로 동작하는지 점검해봅니다.
    Get-WebUrl -url http://localhost/WarmUpTest/ -content
    그러면, 여러분은 아마도 다음과 비슷한 출력을 보게 될 것입니다:
    ResponseUri                   Status          Description     Content
    -----------                   ------          -----------     -------
    http://localhost/WarmUpTest/  OK              OK              Time: 12:37:11    Current ...

이에 더해서 초기화(즉, 웜 업) 동작을 흉내내기 위한 코드도 필요합니다. 설명의 편의를 위해서 몇 초 동안 동작을 중지하는 간단한 루틴을 사용할 것입니다. 방금 사용했던 기법과 같은 기법으로 응용 프로그램 루트 하위의 웹 폴더에 파일을 추가합니다. *

  1. 먼저 응용 프로그램 루트 디렉터리의 바로 하위에 웜 업 디렉터리를 생성합니다:
    New-Item c:\inetpub\WarmUpTest\WarmUpFolder -type Directory
  2. 그 다음에는 스크립트가 작성되어 있는 파일을 추가합니다.
    $txt = @"
    <%@ Page Language="C#" %>
    <%@ import Namespace="System.Diagnostics" %>
    <%@ Import Namespace="System.Threading" %>
    <script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
    Thread.Sleep(20000);
    Response.Write("Done");
    }
    </script>
    
    <html>
    <head>
        <title>ASP.NET Simple Page</title>
    </head>
    <body bgcolor="#FFFFFF">
        <p><asp:label id="Message" runat="server" /></p>
    </body>
    </html>
    "@
  3. 이제 이 Here-String을 웜 업 디렉터리에 default.aspx라는 이름으로 저장합니다:
    New-Item c:\inetpub\WarmUpTest\WarmUpFolder\default.aspx -type File -value $txt
  4. 결과적으로 20초 동안 웜 업 동작을 흉내내어 실행되는 웹 페이지를 갖게 되었습니다. IIS 파워쉘의 Get-WebUrl 커멘드릿을 사용해서 다시 한 번 이 URL에 요청을 전송해봅니다:
    Get-WebUrl -url http://localhost/WarmUpTest/WarmUpFolder/default.aspx -content
    약 20 초 정도 기다려보면 방금 작성한 페이지가 반환한 다음과 같은 출력을 볼 수 있을 것입니다:
    ResponseUri                         Status                Description           Content
    -----------                         ------                -----------           -------
    http://localhost/WarmUpTest/Warm... OK                    OK                    Done...
    이제 IIS 응용 프로그램 웜 업 모듈을 사용할 준비가 모두 끝났습니다.

* 이 파일은 웹 사이트의 일반적인 서비스 페이지에 해당하는 역활을 합니다. 다만, 현재 시간과 작업자 프로세스 ID를 출력하는 이유는 이 페이지를 연속적으로 호출해서 페이지가 수행되는데 걸리는 시간을 파악하고 프로세스 ID를 비교해서 응용 프로그램 풀이 재생되었는지 여부를 살펴보기 위한 것입니다. 당연한 얘기지만 응용 프로그램 풀이 재생되면 프로세스 ID가 변경되므로 재생 여부를 파악하기 용이합니다.

** 이 두 번째 파일은 웹 응용 프로그램에 필요한 초기화 작업을 수행하는 역할을 합니다. 물론, 본문에서는 설명의 편의를 위해 단지 20초 동안 동작을 중지하는 코드를 사용했지만 실제로는 이 파일에 필요로 하는 초기화 루틴을 작성해야 합니다.

응용 프로그램 웜 업 활성화하기

정상적으로 IIS 응용 프로그램 웜 업 모듈을 설치했다면 일단 웹 응용 프로그램이 웜 업 되도록 모듈부터 활성화시켜야 합니다. 다음은 이 작업을 수행하기 위한 명령입니다:

Set-WebConfigurationProperty /system.webServer/httpWarmupGlobalSettings -pspath "IIS:\sites\Default Web Site\WarmUpTest" -name httpWarmupEnabled -value true

이 작업은 IIS 관리자로도 수행할 수 있습니다.

  1. IIS 관리자를 실행합니다.
  2. "Default Web Site" 노드를 확장한 다음, "WarmUpTest" 샘플 응용 프로그램을 선택합니다.
  3. 우측의 Configure 섹션에서 "Application Warm-Up..."을 클릭합니다. *

그러면, "Settings" 대화 상자가 나타납니다. 이 대화 상자에서 "Enable Application Warm-Up" 체크 박스를 클릭합니다.

두 번째 체크 박스인 "Start Application Pool 'DefaultAppPool' when service is started"는 해당 응용 프로그램을 호스트하는 IIS 작업자 프로세스가 즉시 실행될지 여부를 설정합니다. 일반적으로 IIS 작업자 프로세스는 네트워크를 통해서 요청이 전달된 경우처럼 필요한 경우에만 시작됩니다. 작업자 프로세스를 즉시 시작하도록 설정하면 시스템이 다시 시작되거나 서비스가 재시작된 뒤에 응용 프로그램이 웜 업됩니다. 이 두 번째 체크 박스가 체크되지 않으면 응용 프로그램 풀은 실제로 요청을 받은 경우에만 시작되는데, 가령 해당 응용 프로그램 풀이 재생된 경우에는 웜 업이 수행되지만 시스템이 다시 시작되거나 IIS 서비스가 재시작된 뒤에는 웜 업이 수행되지 않습니다.

다음은 IIS 작업자 프로세스의 자동 시작을 활성화시키는 파워쉘 명령입니다:

Set-WebConfigurationProperty '/system.applicationHost/applicationPools/add[@name="DefaultAppPool"]' -pspath machine/webroot/apphost -name startMode -value AlwaysRunning

* 실제로 테스트를 해본 결과 본문의 설명대로 따라하면 원하는 대화 상자가 나타나지 않았습니다. 샘플 응용 프로그램을 선택한 다음, "Application Warm-Up" 기능 아이콘을 더블 클릭하고 우측의 작업 패인에서 "Settings..." 링크 버튼을 클릭합니다. 그러면, 위의 캡춰 이미지와 같은 대화 상자가 나타납니다.

응용 프로그램에 대한 웜 업 요청 추가하기

이제 웜 업을 위한 시스템 준비가 완료되었으므로 이어지는 과정들을 통해서 웜 업 URL들을 추가해보겠습니다. 본문에서는 파워쉘 명령을 이용해서 웜 업 요청들을 추가하는 방법을 살펴봅니다:

Add-WebConfigurationProperty /system.webServer/httpWarmup/requests -pspath 'iis:\Sites\Default Web Site\WarmUpTest' -name collection -value @{requestUrl='WarmUpFolder/default.aspx'}

이 명령은 name 속성만 기본값으로 지정하고 나머지 모든 속성값들을 명시적으로 지정하여 요청을 추가합니다. 그리고, 다음과 같은 명령을 사용해서 모든 파라메터들과 함께 요청을 조회할 수도 있습니다.

Get-WebConfigurationProperty /system.webServer/httpWarmup/requests -pspath 'iis:\Sites\Default Web Site\WarmUpTest' -name collection

이 명령의 출력은 다음과 비슷할 것입니다:

requestUrl           : WarmupFolder/default.aspx
allowedResponseCodes : 200-399
warmupContext        :
sendMode             : Asynchronous
reportWarmupFailure  : False
…

만약, 요청의 특성값들을 기본값 이외의 다른 값으로 변경하고 싶다면, 'set-webconfigurationproperty' 명령을 이용하면 됩니다. 예를 들어서, warmupContext 특성의 값을 변경하고 싶다면 다음과 같은 명령을 이용합니다. (웜 업 컨텍스트는 응용 프로그램 웜 업 모듈에서 설정하는 서버 변수입니다. 이 서버 변수를 이용해서 여러분의 웹 페이지 코드에서 현재 요청이 웜 업 요청인지 확인할 수 있습니다.)

Set-WebConfigurationProperty "/system.webServer/httpWarmup/requests/add[@requestUrl='WarmUpFolder/default.aspx']" -pspath 'iis:\sites\Default Web Site\WarmUpTest' -name warmupContext -value MyWarmUpContext

이번에는 IIS 관리자를 이용해서 웜 업 요청을 추가하는 방법을 살펴보겠습니다. 먼저, 기능 보기에서 "Application Warm-Up"을 마우스로 더블 클릭합니다. 그러면, 웜 업 요청들의 목록 페이지를 볼 수 있습니다. *

작업 패인에서 "Add Request..." 링크 버튼을 클릭합니다. 그러면, "Add Request..." 대화 상자가 나타나는데, 이 대화 상자에서 요청 URL로 "WarmUpFolder/default.aspx"를 입력하고 OK 버튼을 클릭합니다.

그러면, 방금 추가한 새로운 요청이 목록에 나타날 것입니다.

그렇지만, 이렇게 구성할 수 있는 URL에는 몇 가지 제약이 존재합니다:

  • 웜 업 URL은 반드시 응용 프로그램 URL과 연관이 있어야 합니다. 결국 이 얘기는 다른 응용 프로그램이나 다른 사이트로 요청을 전송할 수 없다는 뜻입니다.
  • 기본 문서에 대한 요청은 반드시 '/'로 끝나야 합니다.

그리고, "Add Request" 대화 상자의 다른 필드들은 해당 요청의 파라메터들을 설정합니다.

  • 기대하는 응답 상태 코드(들)을 지정할 수 있습니다. 만약, 응답의 상태 코드가 지정된 영역에 포함되지 않는다면 응용 프로그램 웜 업 모듈은 그 사실을 응용 프로그램 이벤트 로그에 기록한 뒤에 다음 요청을 처리하기 위해 그냥 넘어갑니다.
  • 요청에 서버 변수로 추가될 문자열을 지정할 수 있습니다 ("Request context parameter"). 응용 프로그램 코드에서 이 요청 변수를 점검하면 해당 요청이 웜 업 모듈로부터 보내진 것인지, 일반적인 요청으로부터 보내진 것인지 구분할 수 있습니다.
  • 요청을 동기적 또는 비동기적으로 전송할 수 있습니다. 웜 업 모듈은 다음과 같은 과정을 거쳐서 요청들을 처리합니다: 먼저, 각각 개별적인 스레드를 사용해서 비동기적 요청들을 모두 전송한 다음, 동기적 요청들을 전송합니다. 이 때, 다음 비동기적 요청을 처리하기 전에 먼저 각각의 동기적 요청의 응답을 대기합니다. 그리고, 제어권을 서버로 반환하기 전에 아직까지 완료되지 않은 비동기적 요청들의 응답을 대기합니다.

* 문맥상 이 부분에 캡춰 이미지가 나타나야 할 것 같다는 생각입니다. 아마도 원문의 작성자가 누락한 것으로 생각됩니다. 뿐만 아니라 이미지의 순서도 조금 이상합니다.

응용 프로그램 웜 업 모듈을 사용해보기

웜 업 모듈은 작업자 프로세스가 시작될 때 동작하므로 테스트를 위해서는 작업자 프로세스가 자주 시작되도록 조건을 설정해야 합니다. 이런 조건을 만들어보기 위해서 응용 프로그램 풀을 매번 10번의 요청이 발생할 때마다 재생되도록 설정해보겠습니다. 물론, 이 설정은 단순히 테스트를 위한 것일 뿐으로 실제 업무에서는 보다 현실적인 설정이 필요할 것입니다.

다음은 이를 위한 파워쉘 명령입니다:

Set-ItemProperty IIS:\AppPools\DefaultAppPool -Name recycling.periodicrestart.requests -value 10

만약, IIS 관리자를 이용해서 이 작업을 수행하려면 응용 프로그램 풀 뷰에서 "DefaultAppPool"을 선택하고, 작업 패인에서 "재생..." 링크 버튼을 클릭합니다. 대화 상자가 나타나면 "고정 요청 수" 필드의 값을 10으로 설정합니다. *

그러면, 실제로 수행을 한 번 해보겠습니다. 먼저 파워쉘 명령을 이용해서 "DefaultAppPool"을 재생합니다.

Restart-WebAppPool DefaultAppPool

이렇게 하면 깔끔한 상태로 테스트를 시작할 수 있습니다. 그리고 파워쉘 콘솔에서 다음 스크립트를 수행합니다:

foreach ($i in (1..100)) {
    $s = $i.ToString() + "`t" + (Get-WebUrl -url http://localhost/WarmUpTest -content).Content;
    $s.Substring(0, $s.IndexOf("`n"))
    sleep 1
}

이 간단한 스크립트는 1초에 한 번씩, 백 번의 요청을 웹 응용 프로그램으로 전송하고 응답 내용의 첫 번째 줄을 요청 횟수와 함께 출력합니다. 그리고, 앞에서 구성한 웜 업 URL로 인해서 (20초 동안 동작을 중지하도록 코드를 작성했습니다) 첫 번째 응답이 도착할 때까지 20초의 지연이 발생할 것입니다. 다음은 여러분이 보게될 출력의 한 가지 예입니다: **

1       Time: 14:6:14  Current process: 5936
2       Time: 14:6:15  Current process: 5936
3       Time: 14:6:16  Current process: 5936
…
9       Time: 14:6:22  Current process: 5936
10      Time: 14:6:24  Current process: 5936
11      Time: 14:6:25  Current process: 5936
12      Time: 14:6:26  Current process: 5936
…
23      Time: 14:6:37  Current process: 5936
24      Time: 14:6:38  Current process: 5936
25      Time: 14:6:39  Current process: 5432
26      Time: 14:6:40  Current process: 5432
27      Time: 14:6:41  Current process: 5432
…
34      Time: 14:6:48  Current process: 5432
35      Time: 14:6:49  Current process: 5432
36      Time: 14:6:50  Current process: 5432
37      Time: 14:6:51  Current process: 5432
38      Time: 14:6:52  Current process: 5432
…

이 간단한 테스트를 통해서 웜 업 모듈의 두 가지 이점을 알 수 있습니다.

  1. IIS는 응용 프로그램 풀이 재시작되더라도 새로운 작업자 프로세스가 웜 업 될 때까지 여전히 기존 작업자 프로세스를 사용합니다. 본문에서는 10번의 요청을 처리할 때마다 응용 프로그램 풀이 재생되도록 설정했습니다. 만약, 웜 업 모듈을 적용하지 않았다면 위 목록의 11번째 요청에서 작업자 프로세스가 재생되는 동안 웜 업 지연이 발생하므로 10번째 요청과 11번째 요청 사이에 20초 간의 지연이 발생했을 것입니다. 그러나, 이 사례에서는 (재생된 작업자 프로세스에 대한) 첫 번째 요청이 내부적으로 작업자 프로세스가 프로세싱 루프에 진입하기 전에 전송되며, 전달된 요청 처리에 전혀 지연이 발생하지 않는다는 사실을 확인할 수 있습니다. 여전히 기존 프로세스로부터 즉시 응답을 받을 수 있으며, 새로운 프로세스는 웜 업 루틴에 추가한 20초의 지연 이후에 25번째 요청에서부터 동작을 시작합니다 (프로세스 ID 값을 참고하시기 바랍니다). 만약, 웜 업 모듈이 적용되지 않았다면 작업자 프로세스가 시작되는 동안 IIS의 큐에는 최소한 10개의 요청이 쌓여있었을 것입니다.
  2. 웜 업 비용이 발생하는 시기를 직접 제어할 수 있습니다. 가령, 사이트의 트래픽이 낮은 시간에, 이를테면 3시에 하루에 한 번 응용 프로그램 풀이 재생되도록 설정할 수도 있을 것입니다. 그러나, 이런 경우 웜 업 모듈을 사용하지 않으면 작업자 프로세스는 응용 프로그램에 대한 첫 번째 요청이 도착한 경우에만, 가령 사람들이 일어나서 활동하기 시작하는 오전 7시 쯤에서야 비로소 웜 업이 이뤄질 것입니다. 따라서, 첫 번째 요청을 발생시킨 고객은 그 요청을 처리하는 동안 지연을 겪게 될텐데, 그 이유는 바로 그 사용자가 응용 프로그램 풀을 웜 업시키는 당사자이기 때문입니다. 그 반면, 웜 업 모듈을 적용한 경우라면 응용 프로그램 풀이 시작된 직후, 예를 들면 새벽 3시에 자동적으로 웜 업 요청을 전송할 수 있습니다.

* 이 화면의 작업 패인에는 "재생..." 링크 버튼이 두 가지가 존재하므로 주의하시기 바랍니다. "응용 프로그램 풀 편집" 영역의 "재생..." 링크 버튼을 클릭해야 합니다.

** 그러나, 본문에서 시키는 대로 하면 첫 번째 요청에 대한 응답이 바로 반환됩니다. 즉, 20 초간 지연되지 않습니다. 본문의 설명대로 처리가 이뤄지려면 작업자 프로세스가 즉시 시작되도록 설정하지 않은 상태에서 IIS를 재시작하고 (응용 프로그램 풀 재생이 아닙니다!) 위의 스크립트를 수행해야 합니다.

뭔가 잘못되면 어떻게 하지?

웜 업 모듈의 응답은 브라우저로 반환되거나 디스크에 저장되지 않습니다. 따라서, 만약 웜 업 요청 중 뭔가 잘못된다면 문제 해결을 위해서 IIS 7.5의 요청 추적 기능을 사용하는 것이 가장 바람직합니다. 여기를 클릭해서 요청 추적 기능을 활성화시키는 방법 및 사용 방법을 참고하시기 바랍니다.

고급 시나리오

응용 프로그램 웜 업 모듈에는 몇 가지 편리한 고급 기능들이 존재합니다.

웜 업 요청에 대한 사용자 컨텍스트 사용하기

일부 응용 프로그램은 인증이 이뤄진 경우에만 요청을 처리하는데, 가령 IIS 응용 프로그램 풀을 실행하는 프로세스 신원 계정과는 별도의 특정 사용자 계정으로 코드가 실행되는 경우나 사용자 컨텍스트가 필요한 경우 등이 그렇습니다. 원도우 쉐어포인트 서비스(WSS)가 그 좋은 사례입니다. 사용자의 이름이 설정되지 않은 경우에는 요청이 받아들여지는 대신, 쉐어포인트 로그인 페이지로 재전송됩니다. 물론, 이는 웜 업 요청의 경우에도 동일하게 처리되므로 결과적으로 웜 업 요청이 처리되지 않는 결과를 가져옵니다. 응용 프로그램 웜 업 모듈은 윈도우 쉐어포인트의 사례와 유사한 시나리오를 지원해주기 위해서, 웜 업 모듈이 성공적으로 로그온 한 사용자를 가장하기 위해 필요한 요청에 대한 사용자 컨텍스트를 구성할 수 있도록 지원해줍니다. 다음은 웜 업 요청에 대한 사용자 이름을 구성 설정하기 위한 파워쉘 명령입니다:

Set-WebConfiguration /system.webServer/httpWarmup/userContext -pspath 'IIS:\Sites\Default Web Site\WarmUpTest' -value @{username="myWarmUpUser";authMode="SetUserOnly"}

만약, 명령 프롬프트나 스크립트에서 평문을 사용해서 비밀번호를 변경하고 싶지 않다면, 파워쉘 명령어를 사용해서 사용자의 신원 증명을 얻은 다음, 이를 구성을 위한 입력 데이터로 전달할 수 있습니다.

$cred = get-credential myWarmUpUser
Set-WebConfigurationProperty /system.webServer/httpWarmup/userContext -pspath 'IIS:\Sites\Default Web Site\WarmUpTest' -name Password -value $cred.GetNetworkCredential().Password

이 명령어에서 $cred 변수에는 보안이 적용된 문자열 형식의 비밀번호가 포함되어 있습니다.

동일한 작업을 IIS 관리자에서 수행하려면 다음의 과정을 따라합니다:

응용 프로그램 웜 업 모듈에 대한 기능 페이지를 열고, 작업 패인에서 "Edit User Context..." 링크 버튼을 클릭합니다. *

그러면, "Edit User Context" 대화 상자가 나타날 것입니다. *

웜 업 요청에 사용될 사용자의 이름과 비밀번호를 입력합니다. "Type" 콤보 박스를 지정해서 웜 업 모듈이 가장할 인증 형식을 선택할 수 있습니다. 그리고, "Mode" 콤보 박스를 지정하여 단지 사용자를 지정하기만 할 것인지, 아니면 윈도우 엑세스 토큰까지 생성해서 웜 업 요청에 사용할 것인지 선택할 수 있습니다.

* 이 부분에서도 문맥상 여기에 캡춰 이미지가 나타나야 설명이 자연스러울 것 같다는 생각입니다. 그러나, 이번에도 역시 원문의 작성자가 이미지를 누락한 것으로 보입니다

요청에 대한 웜 업 컨텍스트 사용하기

응용 프로그램 개발자들의 경우 웜 업 요청과 일반적인 요청을 별개로 다루고 싶어할 수도 있습니다. 이를 위해서 응용 프로그램 코드에서 사용할 수 있는 웜 업 컨텍스트를 설정할 수 있습니다. 웜 업 컨텍스트는 응용 프로그램 웜 업 모듈에서 설정하는 WARMUPCONTEXT라는 이름의 서버 변수입니다. 여러분은 WARMUPCONTEXT 서버 변수의 값을 구성 설정에서 지정할 수 있습니다. 다음은 웜 업 컨텍스트를 지정한 요청을 추가하는 파워쉘 명령입니다:

Set-WebConfigurationProperty "/system.webServer/httpWarmup/requests/add[@requestUrl='WarmUpFolder/default.aspx']" -pspath 'iis:\sites\Default Web Site\WarmUpTest' -name warmupContext -value "This is a warmup request"

요약

웹 응용 프로그램 웜 업 모듈은 시작 비용이 높은 응용 프로그램에 대한 세련된 해결방안을 제시해줍니다. 개발자들은 시스템이 다시 시작되거나 응용 프로그램 풀이 재생된 뒤에 자동적으로 실행되는 웜 업 URL을 단순히 지정해주는 것만으로도 간단하게 고객들에게 향상된 경험을 제공해 줄 수 있습니다.