Windows Server 장애 조치(failover) 클러스터에서 IIS World Wide Web Publishing Service 구성

이 문서에서는 WSFC(Windows Server 장애 조치(failover) 클러스터)에서 IIS(Microsoft 인터넷 정보 서비스) W3SVC(World Wide Web Publishing Service)를 구성하는 방법을 설명합니다.

원래 제품 버전: Windows Server 2008 이상 버전, 인터넷 정보 서비스 8.0 이상 버전
원래 KB 번호: 970759

소개

이 문서의 절차는 World Wide Web Publishing Service에만 적용됩니다. 장애 조치(failover) 클러스터에서 FTP 게시 서비스를 구성하는 방법에 대한 지침은 Windows Server 장애 조치( failover) 클러스터에서 IIS용 FTP를 구성하는 방법을 참조하세요.

추가 정보

이전 버전의 인터넷 정보 서비스에서 Microsoft는 Microsoft 클러스터링 인프라를 사용하여 고가용성 웹 서버 인스턴스를 지원하는 일반 리소스 모니터 구성 요소를 제공했습니다. 그러나 이러한 솔루션의 잠재력을 완전히 실현하려면 사용자 지정 코드가 필요했습니다. 또한 Microsoft에서 제공한 일반 스크립트는 고객의 요구를 충족하지 못했습니다. Windows Server 장애 조치(failover) 클러스터링 사용하는 클러스터형 환경에서 IIS 7.0 이상 버전을 구성하려면 사용자 지정(스크립팅) 코드를 사용하여 이러한 고가용성 시나리오를 사용하도록 설정해야 합니다. 이렇게 하면 사용자가 요구 사항에 맞게 설정을 사용자 지정할 수 있습니다. 웹 애플리케이션의 고가용성 통합을 완전히 제어할 수 있습니다. 또한 IIS 7.0에 도입된 관리 및 모니터링을 위한 스크립트 인터페이스는 이전에 제공된 스크립트보다 더 풍부한 환경을 제공합니다.

참고

IIS 7.0 설치 파일에는 IIS 클러스터 관리 작업에 IIS 6.0에 사용되는 Clusweb.vbs및Clusftp.vbs 스크립트 파일이 잘못 포함되어 있습니다. IIS 7.0 이상 버전에서는 이러한 스크립트를 사용하지 마세요.

관리자는 장애 조치(failover) 클러스터링 사용하는 대신 IIS 7.0 이상을 실행하는 여러 서버에서 웹 애플리케이션의 확장성과 가용성을 개선하기 위한 기본 및 기본 방법으로 NLB(네트워크 부하 분산)의 사용을 신중하게 평가하는 것이 좋습니다. NLB의 이점 중 하나는 모든 서버가 들어오는 HTTP(HyperText Transfer Protocol) 요청의 동시 처리에 적극적으로 참여할 수 있다는 것입니다. 또 다른 이점은 NLB IIS 환경에서 웹 애플리케이션의 고가용성을 제공하면서 롤링 업데이트 및 롤백을 훨씬 쉽게 지원할 수 있다는 것입니다. NLB 환경에서 IIS 7.0 이상 버전을 사용하는 방법에 대한 자세한 내용은 다음 문서를 참조하세요.

IIS 서비스를 클러스터링 클러스터링 IIS가 항상 웹 애플리케이션에 대한 고가용성 솔루션을 보장하지는 않는다는 점을 고려하는 것이 중요합니다. IIS 서비스(특히 WWW 서비스)가 실행 중일 수 있지만 특정 애플리케이션 풀의 호스팅 프로세스가 종료되거나 애플리케이션이 내부 서버 HTTP 오류를 throw할 수 있습니다. 사용자 지정 스크립트를 사용하여 웹 애플리케이션을 클러스터링하고 상태를 모니터링하는 것이 장애 조치(failover) 클러스터링 사용하여 고가용성 IIS 클러스터를 달성하는 데 정확하고 권장되는 방법입니다. 다음은 애플리케이션 풀의 상태를 모니터링하여 시작 여부를 확인하는 샘플 스크립트입니다.

장애 조치(failover) 클러스터링 사용하여 IIS 7.0 이상 버전의 웹 서버에 대한 고가용성을 구성하려면 다음 단계를 수행합니다. 3~7단계는 아래에 자세히 설명되어 있습니다. 이 문서의 뒷부분에 있는 샘플 스크립트는 IIS 7.0 이상 버전의 예제로 사용할 수 있습니다.

  1. 모든 클러스터 노드에 웹 서버 역할을 설치합니다. 자세한 내용은 IIS 7 배포 가이드를 참조하세요.
  2. 모든 클러스터 노드에 장애 조치(failover) 클러스터링 기능을 설치하고 클러스터를 만듭니다. 자세한 내용은 장애 조치(failover) 클러스터 배포 가이드를 참조하세요.
  3. IIS 공유 구성에 사용할 파일 공유를 설정합니다.
  4. 모든 클러스터 노드에서 IIS 공유 구성을 구성합니다.
  5. 모든 클러스터 노드에서 공유 구성을 위해 IIS 오프라인 파일을 구성합니다.
  6. 웹 사이트(연결된 애플리케이션 풀 포함)를 구성하고 하나의 클러스터 노드에서 해당 콘텐츠의 위치를 지정합니다.
  7. 장애 조치(failover) 클러스터링 일반 스크립트를 만들어 웹 사이트의 고가용성을 구성합니다.

IIS 공유 구성에 사용할 파일 공유 설정

  1. IIS 공유 구성에 사용할 공유에 액세스할 사용자를 만듭니다.
  2. 파일 공유를 만듭니다. 이 공유는 모든 클러스터 노드에서 IIS 간에 공유되는 IIS 공유 구성을 저장하는 데 사용됩니다. 여러 옵션이 있습니다.
  3. 2단계에서 만든 공유에 대한 권한을 설정합니다. 1단계에서 만든 사용자에게 파일 공유 및 NTFS 권한에 대한 모든 권한 권한을 부여합니다.
  4. 모든 클러스터 노드가 파일 공유를 탐색할 수 있음을 확인합니다. 파일 공유의 경로는 입니다 \\<fileserver>\<share>.

모든 클러스터 노드에서 IIS 공유 구성 구성

참고

에 대한 권한이 누락되어 Windows 2008 Server에서 IIS 공유 구성에 Application Host Helper Service문제가 있습니다. 공유 구성이 작동하려면 Windows 2008 Server에서 IIS 공유 구성을 설정할 때 다음 단계를 수행해야 합니다.

  1. 관리 명령 프롬프트를 열 수 있습니다.

  2. 다음 명령을 실행합니다.

    net stop apphostsvc
    
  3. 다음 명령을 실행합니다.

    sc privs apphostsvc SeChangeNotifyPrivilege/SeTcbPrivilege/SeImpersonatePrivilege
    
  4. 다음 명령을 실행합니다.

    net start apphostsvc
    

클러스터의 각 Windows 2008 Server에서 이러한 단계를 완료한 후 이 섹션에 설명된 대로 IIS 공유 구성을 계속 설정합니다.

클러스터 노드 중 하나에서 공유 구성을 파일 공유로 내보냅니다.

  1. 관리 도구로 이동한 다음 IIS(인터넷 정보 서비스) 관리자를 선택합니다.
  2. 왼쪽 창에서 서버 이름 노드를 선택합니다.
  3. 공유 구성 아이콘을 두 번 클릭합니다.
  4. 공유 구성 페이지의 작업 창(오른쪽 창)에서 구성 내보내기를 선택하여 로컬 컴퓨터에서 다른 위치로 구성 파일을 내보냅니다.
  5. 구성 내보내기 대화 상자의 실제 경로 상자에 파일 공유(\\<fileserver>\<share>)의 경로를 입력합니다.
  6. 다른 이름으로 연결을 선택한 다음 공유 구성이 저장된 공유에 액세스할 수 있는 사용자 계정의 사용자 이름과 암호를 입력한 다음 확인을 선택합니다. 이 계정은 공유에 액세스하는 데 사용됩니다. 도메인 관리자가 아닌 제한된 Active Directory 계정을 사용해야 합니다.
  7. 구성 내보내기 대화 상자에서 암호화 키를 보호하는 데 사용할 암호를 입력한 다음 확인을 선택합니다.
  8. 공유 구성 페이지에서 공유 구성 검사 사용 상자를 선택합니다.
  9. 이전에 입력한 실제 경로, 사용자 계정 및 암호를 입력한 다음 작업 창에서적용을 선택합니다.
  10. 암호화 키 암호 대화 상자에서 이전에 설정한 암호화 키 암호를 입력한 다음 확인을 선택합니다.
  11. 공유 구성 대화 상자에서 확인을 선택합니다.
  12. 확인을 선택합니다.

다른 각 클러스터 노드에서 방금 파일 공유로 내보낸 공유 구성을 사용합니다.

  1. 관리 도구로 이동한 다음 IIS(인터넷 정보 서비스) 관리자를 선택합니다.
  2. 서버 이름 노드를 선택합니다.
  3. 공유 구성 아이콘을 두 번 클릭합니다.
  4. 공유 구성 페이지에서 공유 구성 검사 사용 상자를 선택합니다.
  5. 이전에 입력한 파일 공유(\\<fileserver>\<share>), 사용자 계정 및 암호의 실제 경로를 입력한 다음 작업 창에서적용을 선택합니다.
  6. 암호화 키 암호 대화 상자에서 이전에 설정한 암호화 키 암호를 입력한 다음 확인을 선택합니다.
  7. 공유 구성 대화 상자에서 확인을 선택합니다.
  8. 확인을 선택합니다.

참고

IIS에서 공유 구성을 설정하는 방법에 대한 자세한 내용은 공유 구성을 참조하세요.

모든 클러스터 노드에서 공유 구성을 위한 IIS 오프라인 파일 구성

각 클러스터 노드에서 오프라인 파일을 사용하도록 설정합니다.

  1. 데스크톱 환경 설치

    1. 관리 도구로 이동한 다음 서버 관리자 선택합니다.
    2. 왼쪽 창에서 기능을 선택합니다.
    3. 오른쪽 창에서 기능 추가 를 선택합니다.
    4. Windows 버전에 따라 다음 중 하나를 수행합니다.
      • Windows Server 2016 데스크톱 환경으로 서버 설치를 참조하세요.
      • Windows Server 2102 및 2012 R2의 경우 기능 목록의 사용자 인터페이스 및 인프라에서 데스크톱 환경을 선택합니다.
      • Windows Server 2008 및 2008 R2의 경우 데스크톱 환경을 선택합니다.
    5. 설치를 선택하여 데스크톱 환경을 설치합니다.
    6. 컴퓨터를 다시 시작합니다.
  2. 다음 중 하나를 수행합니다.

    • Windows Server 2012, 2012 R2 및 2016의 경우 제어판 동기화 센터를 선택한 다음 오프라인 파일 관리를 선택합니다.
    • Windows Server 2008 및 2008 R2의 경우 제어판 오프라인 파일을 선택합니다.
  3. 오프라인 파일 사용을 선택합니다. 현재 컴퓨터를 다시 시작하지 마세요.

  4. 캐시가 읽기 전용으로 설정되어 있는지 확인합니다. 이렇게 하려면 관리자 권한 cmd 프롬프트에서 다음 명령을 실행합니다.

    REG ADD "HKLM\System\CurrentControlSet\Services\CSC\Parameters" /v ReadOnlyCache /t REG_DWORD /d 1 /f
    
  5. 컴퓨터를 다시 시작합니다.

  6. 컴퓨터에서 파일 서버로 이동합니다. IIS 공유 구성이 포함된 공유를 마우스 오른쪽 단추로 클릭한 다음 , Always Available Offline을 선택합니다.

    참고

    IIS 노드를 호스트하는 동일한 장애 조치(failover) 클러스터에서 파일 공유를 고가용성으로 설정하면 사용 가능한 클러스터 노드가 고가용성 파일 서버를 호스팅하는 경우 공유를 마우스 오른쪽 단추로 클릭할 때 항상 사용 가능한 오프라인 옵션이 표시되지 않습니다. 고가용성 파일 서버 애플리케이션을 다른 노드로 이동해야 합니다.

  7. 제어판 오프라인 파일을 엽니다. 동기화 센터 열기를 선택한 다음, 일정을 선택합니다.

  8. 매일 또는 요구 사항에 따라 오프라인 파일 동기화를 예약합니다. 몇 분마다 실행되도록 오프라인 동기화를 구성할 수도 있습니다. 스케줄러를 설정하지 않더라도 Applicationhost.config 파일에서 변경한 내용이 웹 서버에 반영됩니다.

참고

IIS에서 공유 구성에 대해 오프라인 파일을 구성하는 방법에 대한 자세한 내용은 공유 구성을 위한 오프라인 파일을 참조하세요.

웹 사이트를 구성하고 하나의 클러스터 노드에서 해당 콘텐츠의 위치를 지정합니다.

웹 사이트 콘텐츠 파일이 유지되는 클러스터 디스크 리소스를 소유하는 클러스터 노드를 찾습니다.

  1. 관리 도구로 이동한 다음 장애 조치(failover) 클러스터 관리자를 선택합니다.
  2. 클러스터에 연결합니다. 클러스터 노드 중 하나에 있는 경우 클러스터가 목록에 자동으로 표시됩니다.
  3. 스토리지에서 웹 페이지 콘텐츠가 상주할 디스크 리소스를 찾습니다. 이렇게 하려면 디스크 리소스에 대한 스토리지 트리를 확장합니다. 스토리지가 클러스터의 다른 고가용성 애플리케이션에서 사용되지 않는지 확인합니다. 사용 가능한 스토리지 아래에 스토리지가 있습니다.
  4. 이 리소스가 온라인 상태인 클러스터 노드입니다. 해당 클러스터 노드에서 IIS를 구성합니다.
  5. 클러스터 디스크 리소스 이름입니다.

콘텐츠 파일에 사용합니다. 리소스가 온라인 상태인 클러스터 노드에서 웹 사이트 콘텐츠에 공유 디스크를 사용하도록 웹 서버를 구성합니다.

  1. 관리 도구로 이동한 다음 IIS(인터넷 정보 서비스) 관리자를 선택합니다.
  2. 왼쪽 창에서 서버 이름 노드를 확장합니다.
  3. 사이트를 확장한 다음 사이트 아래에서 구성 중인 사이트를 선택합니다.
  4. 오른쪽 창의 웹 사이트 관리에서 고급 설정을 선택합니다.
  5. 일반 설정에서 물리적 경로 속성을 찾은 다음 웹 사이트 콘텐츠 파일이 있는 위치를 입력합니다. 이전 절차의 5단계에서 기록한 클러스터 디스크 리소스의 위치입니다.
  6. 확인을 선택합니다.

장애 조치(failover) 클러스터 관리자에서 일반 스크립트를 만들어 웹 사이트의 고가용성 구성

IIS 웹 서버에 대한 고가용성을 구성하는 마지막 단계에서 웹 사이트의 웹 사이트 및 애플리케이션 풀을 모니터링하는 데 사용할 일반 스크립트 리소스를 설정합니다.

  1. 각 클러스터 노드에서 이 문서의 끝에 제공된 스크립트를 에 복사합니다 Windows\System32\inetsrv\Clusweb7.vbs.

  2. 기본적으로 스크립트는 기본 웹 사이트 라는 웹 사이트와 DefaultAppPool이라는 애플리케이션 풀을 모니터링합니다. 올바른 웹 사이트 및 애플리케이션 풀이 아닌 경우 변수를 SITE_NAME and APP_POOL_NAME 변경합니다. 스크립트의 동일한 웹 사이트 및 애플리케이션 풀이 모든 클러스터 노드에 있는지 확인합니다.

    참고

    이름은 대/소문자를 구분합니다.

  3. 관리 도구로 이동한 다음 장애 조치(failover) 클러스터 관리자를 선택합니다.

  4. 클러스터에 연결합니다. 클러스터 노드 중 하나에 있는 경우 클러스터가 목록에 자동으로 표시됩니다.

  5. 다음 중 하나를 수행합니다.

    • Windows Server 2012 2012 R2 및 2016의 경우 역할을 마우스 오른쪽 단추 클릭한 다음 역할 구성을 선택하여 만듭니다.
    • Windows Server 2008 및 2008 R2의 경우 클러스터를 마우스 오른쪽 단추로 클릭한 다음 서비스 또는 애플리케이션 구성을 선택합니다. 마법사는 고가용성 워크로드를 만듭니다.
  6. 일반 스크립트를 선택합니다.

  7. 에서 %systemroot%\System32\Inetsrv\clusweb7.vbs스크립트 파일을 선택합니다.

  8. CAP(클라이언트 액세스 지점) 이름을 클라이언트가 고가용성 웹 사이트에 연결하는 데 사용할 웹 사이트 이름으로 설정합니다. 웹 사이트 CAP에 사용할 정적 IP를 지정합니다. DHCP(동적 호스트 구성 프로토콜)를 사용하는 경우 이 옵션이 표시되지 않습니다.

  9. 스토리지 선택 단계에서 웹 사이트 콘텐츠 파일이 있는 클러스터 공유 디스크를 선택합니다. 스토리지는 클러스터의 다른 고가용성 애플리케이션에서 사용하지 않아야 합니다.

    참고

    IIS 공유 구성에 사용되는 파일 공유가 동일한 클러스터에서 호스트되는 경우 여기에서 다른 디스크 리소스를 사용해야 합니다.

  10. 설정을 확인한 후 마법사는 클러스터 그룹, 클러스터 리소스 및 리소스 간의 종속성을 만든 다음 리소스를 온라인으로 가져옵니다.

    참고

    동일한 장애 조치(failover) 클러스터에서 여러 고가용성 웹 사이트를 호스트하려면 위와 동일한 단계를 수행합니다. 그러나 각 웹 사이트 및 다른 클러스터형 공유 스토리지에 대해 다른 스크립트 파일을 사용합니다. 예를 들어 에서 %systemroot%\System32\Inetsrv첫 번째 웹 사이트에 clusweb7.vbs 사용하고, 두 번째 웹 사이트에는 clweb7-2.vbs , 세 번째 웹 사이트에는 clweb7-3.vbs 등을 사용합니다. 각 스크립트 파일은 다른 웹 사이트 및 애플리케이션 풀을 모니터링합니다.

다음 스크립트는 샘플 용도로만 제공되며 Microsoft에서 명시적으로 지원되지 않습니다. IIS 7.0 이상 버전 클러스터형 환경에서 이 스크립트를 사용하는 것은 사용자 고유의 위험에 처해 있습니다.

'<begin script sample>
'This script provides high availability for IIS websites
'By default, it monitors the "Default Web Site" and "DefaultAppPool"
'To monitor another website, change the SITE_NAME below
'To monitor another application pool, change the APP_POOL_NAME below
'More thorough and application-specific health monitoring logic can be added to the script if needed

Option Explicit

DIM SITE_NAME
DIM APP_POOL_NAME
Dim START_WEB_SITE
Dim START_APP_POOL
Dim SITES_SECTION_NAME
Dim APPLICATION_POOLS_SECTION_NAME
Dim CONFIG_APPHOST_ROOT
Dim STOP_WEB_SITE

'Note:
'Replace this with the site and application pool you want to configure high availability for
'Make sure that the same website and application pool in the script exist on all cluster nodes. Note that the names are case-sensitive.
SITE_NAME = "Default Web Site"
APP_POOL_NAME = "DefaultAppPool"

START_WEB_SITE = 0
START_APP_POOL = 0
STOP_WEB_SITE  = 1
SITES_SECTION_NAME = "system.applicationHost/sites"
APPLICATION_POOLS_SECTION_NAME = "system.applicationHost/applicationPools"
CONFIG_APPHOST_ROOT = "MACHINE/WEBROOT/APPHOST"

'Helper script functions
'Find the index of the website on this node
Function FindSiteIndex(collection, siteName)
    Dim i
    FindSiteIndex = -1

    For i = 0 To (CInt(collection.Count) - 1)
        If collection.Item(i).GetPropertyByName("name").Value = siteName Then
            FindSiteIndex = i
            Exit For
        End If
    Next
End Function

'Find the index of the application pool on this node
Function FindAppPoolIndex(collection, appPoolName)
    Dim i
    FindAppPoolIndex = -1

    For i = 0 To (CInt(collection.Count) - 1)
        If collection.Item(i).GetPropertyByName("name").Value = appPoolName Then
            FindAppPoolIndex = i
            Exit For
        End If
    Next
End Function

'Get the state of the website
Function GetWebSiteState(adminManager, siteName)

    Dim sitesSection, sitesSectionCollection, siteSection, index, siteMethods, startMethod, executeMethod
    Set sitesSection = adminManager.GetAdminSection(SITES_SECTION_NAME, CONFIG_APPHOST_ROOT)
    Set sitesSectionCollection = sitesSection.Collection

    index = FindSiteIndex(sitesSectionCollection, siteName)
    If index = -1 Then
        GetWebSiteState = -1
    End If

    Set siteSection = sitesSectionCollection(index)
    GetWebSiteState = siteSection.GetPropertyByName("state").Value
End Function

'Get the state of the ApplicationPool
Function GetAppPoolState(adminManager, appPool)
    Dim configSection, index, appPoolState

    set configSection = adminManager.GetAdminSection(APPLICATION_POOLS_SECTION_NAME, CONFIG_APPHOST_ROOT)
    index = FindAppPoolIndex(configSection.Collection, appPool)

    If index = -1 Then
        GetAppPoolState = -1
    End If

    GetAppPoolState = configSection.Collection.Item(index).GetPropertyByName("state").Value
End Function

'Start the w3svc service on this node
Function StartW3SVC()
    Dim objWmiProvider
    Dim objService
    Dim strServiceState
    Dim response

    'Check to see if the service is running
    set objWmiProvider = GetObject("winmgmts:/root/cimv2")
    set objService = objWmiProvider.get("win32_service='w3svc'")
    strServiceState = objService.state

    If ucase(strServiceState) = "RUNNING" Then
        StartW3SVC = True
    Else
        'If the service is not running, try to start it
        response = objService.StartService()

        'response = 0  or 10 indicates that the request to start was accepted
        If ( response <> 0 ) and ( response <> 10 ) Then
            StartW3SVC = False
        Else
            StartW3SVC = True
        End If
    End If
End Function

'Start the application pool for the website
Function StartAppPool()
    Dim ahwriter, appPoolsSection, appPoolsCollection, index, appPool, appPoolMethods, startMethod, callStartMethod
    Set ahwriter = CreateObject("Microsoft.ApplicationHost.WritableAdminManager")

    Set appPoolsSection = ahwriter.GetAdminSection(APPLICATION_POOLS_SECTION_NAME, CONFIG_APPHOST_ROOT)
    Set appPoolsCollection = appPoolsSection.Collection
    index = FindAppPoolIndex(appPoolsCollection, APP_POOL_NAME)
    Set appPool = appPoolsCollection.Item(index)

    'See if it is already started
    If appPool.GetPropertyByName("state").Value = 1 Then
        StartAppPool = True
        Exit Function
    End If

    'Try To start the application pool
    Set appPoolMethods = appPool.Methods
    Set startMethod = appPoolMethods.Item(START_APP_POOL)
    Set callStartMethod = startMethod.CreateInstance()
    callStartMethod.Execute()

    'If started return true, otherwise return false
    If appPool.GetPropertyByName("state").Value = 1 Then
        StartAppPool = True
    Else
        StartAppPool = False
    End If
End Function

'Start the website
Function StartWebSite()
    Dim ahwriter, sitesSection, sitesSectionCollection, siteSection, index, siteMethods, startMethod, executeMethod
    Set ahwriter = CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
    Set sitesSection = ahwriter.GetAdminSection(SITES_SECTION_NAME, CONFIG_APPHOST_ROOT)
    Set sitesSectionCollection = sitesSection.Collection
    index = FindSiteIndex(sitesSectionCollection, SITE_NAME)
    Set siteSection = sitesSectionCollection(index)

    if siteSection.GetPropertyByName("state").Value = 1 Then
        'Site is already started
        StartWebSite = True
        Exit Function
    End If

    'Try to start site
    Set siteMethods = siteSection.Methods
    Set startMethod = siteMethods.Item(START_WEB_SITE)
    Set executeMethod = startMethod.CreateInstance()
    executeMethod.Execute()

    'Check to see if the site started, if not return false
    If siteSection.GetPropertyByName("state").Value = 1 Then
        StartWebSite = True
    Else
        StartWebSite = False
    End If
End Function

'Stop the website
Function StopWebSite()
    Dim ahwriter, sitesSection, sitesSectionCollection, siteSection, index, siteMethods, startMethod, executeMethod, autoStartProperty
    Set ahwriter = CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
    Set sitesSection = ahwriter.GetAdminSection(SITES_SECTION_NAME, CONFIG_APPHOST_ROOT)
    Set sitesSectionCollection = sitesSection.Collection
    index = FindSiteIndex(sitesSectionCollection, SITE_NAME)
    Set siteSection = sitesSectionCollection(index)

    'Stop the site
    Set siteMethods = siteSection.Methods
    Set startMethod = siteMethods.Item(STOP_WEB_SITE)
    Set executeMethod = startMethod.CreateInstance()
    executeMethod.Execute()
End Function

'Cluster resource entry points. More details here:
'http://msdn.microsoft.com/en-us/library/aa372846(VS.85).aspx
'Cluster resource Online entry point
'Make sure the website and the application pool are started
Function Online( )
    Dim bOnline
    'Make sure w3svc is started
    bOnline = StartW3SVC()

    If bOnline <> True Then
        Resource.LogInformation "The resource failed to come online because w3svc could not be started."
        Online = False
        Exit Function
    End If

    'Make sure the application pool is started
    bOnline = StartAppPool()
    If bOnline <> True Then
        Resource.LogInformation "The resource failed to come online because the application pool could not be started."
        Online = False
        Exit Function
    End If

    'Make sure the website is started
    bOnline = StartWebSite()
    If bOnline <> True Then
        Resource.LogInformation "The resource failed to come online because the web site could not be started."
        Online = False
        Exit Function
    End If

    Online = true
End Function

'Cluster resource offline entry point
'Stop the website
Function Offline( )
    StopWebSite()
    Offline = true
End Function

'Cluster resource LooksAlive entry point
'Check for the health of the website and the application pool
Function LooksAlive( )
    Dim adminManager, appPoolState, configSection, i, appPoolName, appPool, index
    i = 0
    Set adminManager  = CreateObject("Microsoft.ApplicationHost.AdminManager")
    appPoolState = -1

    'Get the state of the website
    if GetWebSiteState(adminManager, SITE_NAME) <> 1 Then
        Resource.LogInformation "The resource failed because the " & SITE_NAME & " web site is not started."
        LooksAlive = false
        Exit Function
    End If

    'Get the state of the Application Pool
    if GetAppPoolState(adminManager, APP_POOL_NAME) <> 1 Then
         Resource.LogInformation "The resource failed because Application Pool " & APP_POOL_NAME & " is not started."
         LooksAlive = false  
         Exit Function
    End if

    'Web site and Application Pool state are valid return true
    LooksAlive = true
End Function

'Cluster resource IsAlive entry point
'Do the same health checks as LooksAlive
'If a more thorough than what we do in LooksAlive is required, this should be performed here
Function IsAlive()
    IsAlive = LooksAlive
End Function

'Cluster resource Open entry point
Function Open()
    Open = true
End Function

'Cluster resource Close entry point
Function Close()
    Close = true
End Function

'Cluster resource Terminate entry point
Function Terminate()
    Terminate = true
End Function
'<end script sample>