Настройка службы веб-публикации IIS в отказоустойчивом кластере Windows Server

В этой статье описывается, как настроить службу Microsoft IIS (IIS) World Wide Web Publishing Service (W3SVC) в отказоустойчивом кластере Windows Server (WSFC).

Исходная версия продукта: Windows Server 2008 и более поздних версий, служб IIS 8.0 и более поздних версий
Исходный номер базы знаний: 970759

Введение

Процедуры, описанные в этой статье, применяются только к службе публикации в Интернете. Инструкции по настройке службы публикации FTP в отказоустойчивом кластере см . в статье Настройка FTP для IIS в отказоустойчивом кластере Windows Server.

Дополнительная информация

В более ранних версиях служб IIS корпорация Майкрософт предоставляла универсальные компоненты мониторинга ресурсов для поддержки экземпляров веб-сервера с высоким уровнем доступности с помощью инфраструктуры кластеризации Майкрософт. Однако для полной реализации потенциала такого решения необходим пользовательский код. Кроме того, универсальные скрипты, предоставляемые корпорацией Майкрософт, не удовлетворяют потребности клиентов. Чтобы настроить IIS 7.0 или более позднюю версию в кластеризованной среде, которая использует отработку отказа Windows Server кластеризация, необходимо использовать пользовательский код (скрипты) для обеспечения такого сценария с высоким уровнем доступности. После этого пользователи могут настроить настройку в соответствии со своими требованиями. что дает им полный контроль над интеграцией веб-приложений с высоким уровнем доступности. Кроме того, интерфейсы скриптов для администрирования и мониторинга, представленные в IIS 7.0, предоставляют более богатую среду, чем скрипты, которые были предоставлены ранее.

Примечание.

Файлы установки IIS 7.0 неправильно включают файлы сценариевClusweb.vbs и Clusftp.vbs , которые используются в IIS 6.0 для задач администрирования кластера IIS. Не используйте эти скрипты с IIS 7.0 или более поздней версии.

Рекомендуется, чтобы администраторы тщательно оценили использование балансировки сетевой нагрузки (NLB) в качестве основного и предпочтительного метода для повышения масштабируемости и доступности веб-приложений с несколькими серверами под управлением IIS 7.0 или более поздней версии, а не использование отработки отказа кластеризация. Одним из преимуществ NLB является то, что все серверы могут активно участвовать в одновременной обработке входящих http-запросов. Еще одно преимущество заключается в том, что в среде IIS с балансировкой нагрузки гораздо проще поддерживать последовательные обновления и откаты, обеспечивая при этом высокий уровень доступности веб-приложений. Дополнительные сведения об использовании IIS 7.0 или более поздней версии в среде балансировки нагрузки см. в следующих статьях:

Важно учитывать, что кластеризация IIS с помощью кластеризация службы IIS не всегда гарантируют высокий уровень доступности веб-приложений. Хотя службы IIS (в частности, служба WWW) могут быть запущены, процесс размещения определенного пула приложений может завершиться или приложение может вызвать внутренние ошибки HTTP сервера. Кластеризация веб-приложений и мониторинг их работоспособности с помощью пользовательского скрипта — это правильный и рекомендуемый способ обеспечения высокого уровня доступности кластера IIS с помощью отработки отказа кластеризация. Ниже приведен пример скрипта, который отслеживает состояние пула приложений, чтобы определить, запущен ли он.

Чтобы настроить высокий уровень доступности для веб-сервера IIS 7.0 или более поздней версии с помощью кластеризация отработки отказа, выполните следующие действия. Ниже описаны шаги 3–7. Пример скрипта далее в этой статье можно использовать в качестве примера для IIS 7.0 или более поздней версии.

  1. Установите роль веб-сервера на всех узлах кластера. Дополнительные сведения см. в руководстве по развертыванию IIS 7.
  2. Установите компонент кластеризация отработки отказа на всех узлах кластера и создайте кластер. Дополнительные сведения см. в руководстве по развертыванию отказоустойчивого кластера.
  3. Настройте общую папку, которая будет использоваться для общей конфигурации IIS.
  4. Настройте общую конфигурацию IIS на всех узлах кластера.
  5. Настройка автономных файлов IIS для общей конфигурации на всех узлах кластера.
  6. Настройте веб-сайт (включая связанный пул приложений) и укажите расположение его содержимого на одном узле кластера.
  7. Настройте высокий уровень доступности для веб-сайта, создав универсальный скрипт в кластеризация отработки отказа.

Настройка общей папки, которая будет использоваться для общей конфигурации IIS

  1. Создайте пользователя, который будет обращаться к общей папке, которая будет использоваться для общей конфигурации IIS.
  2. Создайте общую папку. Этот общий ресурс будет использоваться для хранения общей конфигурации IIS, которая будет использоваться службами IIS на всех узлах кластера. Существует несколько вариантов:
  3. Задайте разрешения для общей папки, созданной на шаге 2. Предоставьте пользователю, созданному на шаге 1 полный доступ, разрешения на доступ к общей папке и NTFS.
  4. Убедитесь, что все узлы кластера могут переходить к общей папке. Путь к общей папке — \\<fileserver>\<share>.

Настройка общей конфигурации IIS на всех узлах кластера

Примечание.

Существует проблема с общей конфигурацией IIS в Windows 2008 Server из-за отсутствия привилегий Application Host Helper Serviceдля . Для работы общей конфигурации необходимо выполнить следующие действия при настройке общей конфигурации IIS в Windows 2008 Server.

  1. Откройте командную команду администратора.

  2. Выполните следующую команду:

    net stop apphostsvc
    
  3. Выполните следующую команду:

    sc privs apphostsvc SeChangeNotifyPrivilege/SeTcbPrivilege/SeImpersonatePrivilege
    
  4. Выполните следующую команду:

    net start apphostsvc
    

После выполнения этих действий на каждом сервере Windows 2008 в кластере продолжайте настройку общей конфигурации 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. Убедитесь, что для кэша задано значение только для чтения. Для этого выполните следующую команду в командной строке с повышенными привилегиями:

    REG ADD "HKLM\System\CurrentControlSet\Services\CSC\Parameters" /v ReadOnlyCache /t REG_DWORD /d 1 /f
    
  5. Перезагрузите компьютер.

  6. Перейдите на файловый сервер с компьютера. Щелкните правой кнопкой мыши общую папку, содержащую общую конфигурацию IIS, а затем выберите Пункт Всегда доступен в автономном режиме.

    Примечание.

    Если в том же отказоустойчивом кластере, где размещены узлы IIS, общий файловый ресурс настроен так, чтобы он был высокодоступен, параметр Always Available Offline не будет отображаться при щелчке правой кнопкой мыши общей папки, если на узле кластера, на котором размещен высокодоступный файловый сервер. Вам потребуется переместить приложение файлового сервера с высоким уровнем доступности на другой узел.

  7. В панель управления откройте автономные файлы. Выберите Открыть центр синхронизации, а затем — Расписание.

  8. Запланируйте автономную синхронизацию файлов на каждый день или в соответствии с вашими требованиями. Вы также можете настроить автономную синхронизацию для выполнения каждые несколько минут. Даже если планировщик не настроен, при изменении чего-либо в файлеApplicationhost.config это изменение отражается на веб-сервере.

Примечание.

Дополнительные сведения о настройке автономных файлов для общей конфигурации в IIS см. в разделе Автономные файлы для общей конфигурации.

Настройте веб-сайт и укажите расположение его содержимого на одном узле кластера.

Найдите узел кластера, которому принадлежит ресурс диска кластера, где будут оставаться файлы содержимого веб-сайта:

  1. Перейдите в раздел Администрирование, а затем выберите Диспетчер отказоустойчивости кластеров.
  2. Подключитесь к кластеру. Если вы находитесь на одном из узлов кластера, кластер автоматически появится в списке.
  3. В разделе Хранилище найдите ресурс диска, в котором будет размещаться содержимое веб-страницы. Для этого разверните дерево хранилища для ресурса диска. Убедитесь, что хранилище не используется другим приложением с высоким уровнем доступности в кластере. Хранилище будет находиться в разделе Доступное хранилище.
  4. Узел кластера, на котором этот ресурс находится в сети. Вы настроите СЛУЖБЫ IIS на этом узле кластера.
  5. Имя ресурса диска кластера.

Вы будете использовать его для файлов содержимого. На узле кластера, на котором находится ресурс в сети, настройте веб-сервер для использования общего диска для содержимого веб-сайта:

  1. Перейдите в раздел Администрирование, а затем выберите Диспетчер служб IIS.
  2. В левой области разверните узел имя сервера.
  3. Разверните узел Сайты, а затем в разделе Сайты выберите сайт, который вы настраиваете.
  4. В области справа выберите Дополнительные параметры в разделе Управление веб-сайтом.
  5. Найдите свойство Физический путь в разделе Общие параметры и введите расположение, в котором находятся файлы содержимого веб-сайта. Это расположение ресурса диска кластера, указанное на шаге 5 предыдущей процедуры.
  6. Нажмите ОК.

Настройка высокого уровня доступности для веб-сайта путем создания универсального сценария в диспетчере отказоустойчивости кластеров

Чтобы на последнем шаге настроить высокий уровень доступности для веб-серверов IIS, настройте ресурс универсального скрипта, который будет использоваться для мониторинга веб-сайта и пула приложений для веб-сайта:

  1. На каждом узле кластера скопируйте скрипт, предоставленный в конце этой статьи, в Windows\System32\inetsrv\Clusweb7.vbs.

  2. По умолчанию скрипт отслеживает веб-сайт с именем "Веб-сайт по умолчанию " и пул приложений с именем DefaultAppPool. Если это неправильный веб-сайт и пул приложений, измените SITE_NAME and APP_POOL_NAME переменные. Убедитесь, что один и тот же веб-сайт и пул приложений в скрипте существуют на всех узлах кластера.

    Примечание.

    В именах учитывается регистр.

  3. Перейдите в раздел Администрирование, а затем выберите Диспетчер отказоустойчивости кластеров.

  4. Подключитесь к кластеру. Если вы находитесь на одном из узлов кластера, кластер автоматически появится в списке.

  5. Выполните одно из следующих действий.

    • Для Windows Server 2012, 2012 R2 и 2016 щелкните правой кнопкой мыши роли и выберите Настроить роль, чтобы создать ее.
    • Для Windows Server 2008 и 2008 R2 щелкните кластер правой кнопкой мыши и выберите пункт Настроить службу или приложение. Мастер создает рабочую нагрузку высокого уровня доступности.
  6. Выберите Универсальный скрипт.

  7. Выберите файл скрипта из %systemroot%\System32\Inetsrv\clusweb7.vbs.

  8. Задайте имя клиентской точки доступа (CAP) в качестве имени веб-сайта, которое клиенты будут использовать для подключения к веб-сайту с высоким уровнем доступности. Укажите статические IP-адреса, которые будут использоваться для cap веб-сайта. Если вы используете протокол DHCP, этот параметр не отображается.

  9. На шаге Выбор хранилища выберите общий диск кластера, на котором находятся файлы содержимого веб-сайта. Хранилище должно быть неиспользуемо любым другим приложением с высоким уровнем доступности в кластере.

    Примечание.

    Если общая папка, используемая для общей конфигурации IIS, размещена в том же кластере, здесь следует использовать другой дисковый ресурс.

  10. После подтверждения параметров мастер создаст группу кластера, ресурсы кластера и зависимости между ресурсами, а затем переведет ресурсы в режим "в сети".

    Примечание.

    Чтобы разместить несколько веб-сайтов с высоким уровнем доступности в одном отказоустойчивом кластере, выполните те же действия, что и выше. Однако для каждого веб-сайта используйте другой файл скрипта и другое кластеризованное общее хранилище. Например, в %systemroot%\System32\Inetsrvиспользуйте clusweb7.vbs для первого веб-сайта, clweb7-2.vbs для второго, clweb7-3.vbs для третьего и т. д. Каждый файл скрипта отслеживает отдельный веб-сайт и пул приложений.

Следующий скрипт предназначен только для примера и не поддерживается корпорацией Майкрософт явным образом. Использование этого скрипта в кластеризованной среде 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>