Поделиться через


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

В этой статье описывается настройка службы веб-публикации Microsoft IIS (IIS) в отказоустойчивом кластере Windows Server (WSFC).

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

Введение

Процедуры, описанные в этой статье, применяются только к службе веб-публикации World Wide. Инструкции по настройке службы публикации 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 NLB гораздо проще поддерживать последовательные обновления и откаты, обеспечивая высокий уровень доступности веб-приложений. Дополнительные сведения об использовании IIS 7.0 или более поздней версии в среде NLB см. в следующих статьях:

Важно учитывать, что кластеризация СЛУЖБ 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 на всех узлах кластера

Примечание.

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

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

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

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

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

    net start apphostsvc
    

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

На одном из узлов кластера экспортируйте общую конфигурацию в общую папку:

  1. Перейдите к средствам администрирования и выберите диспетчер службы IIS (IIS).
  2. В левой области выберите узел имени сервера.
  3. Дважды щелкните значок общей конфигурации .
  4. На странице "Общая конфигурация" выберите "Экспорт конфигурации" в области "Действия" (справа), чтобы экспортировать файлы конфигурации с локального компьютера в другое расположение.
  5. В диалоговом окне "Конфигурация экспорта" введите путь к общей папке (\\<fileserver>\<share>) в поле "Физический путь".
  6. Выберите "Подключить как", а затем введите имя пользователя и пароль для учетной записи пользователя с доступом к общей папке, в которой хранится общая конфигурация, и нажмите кнопку "ОК". Эта учетная запись будет использоваться для доступа к общей папке. Следует использовать ограниченную учетную запись Active Directory, которая не является администратором домена.
  7. В диалоговом окне "Экспорт конфигурации" введите пароль, который будет использоваться для защиты ключей шифрования, а затем нажмите кнопку "ОК".
  8. На странице "Общая конфигурация" установите флажок "Включить общую конфигурацию".
  9. Введите физический путь, учетную запись пользователя и пароль, введенный ранее, а затем выберите "Применить " на панели "Действия ".
  10. В диалоговом окне "Пароль ключей шифрования" введите пароль ключа шифрования, заданный ранее, и нажмите кнопку "ОК".
  11. В диалоговом окне "Общая конфигурация" нажмите кнопку "ОК".
  12. Нажмите кнопку ОК.

На каждом из других узлов кластера используйте общую конфигурацию, которую вы только что экспортировали в общую папку:

  1. Перейдите к средствам администрирования и выберите диспетчер службы IIS (IIS).
  2. Выберите узел имени сервера.
  3. Дважды щелкните значок общей конфигурации .
  4. На странице "Общая конфигурация" установите флажок "Включить общую конфигурацию".
  5. Введите физический путь к общей папке (\\<fileserver>\<share>), учетную запись пользователя и пароль, введенный ранее, а затем нажмите кнопку "Применить" на панели "Действия ".
  6. В диалоговом окне "Пароль ключей шифрования" введите пароль ключа шифрования, заданный ранее, и нажмите кнопку "ОК".
  7. В диалоговом окне "Общая конфигурация" нажмите кнопку "ОК".
  8. Нажмите кнопку ОК.

Примечание.

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

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

На каждом узле кластера включите автономные файлы:

  1. Установка рабочего стола

    1. Перейдите к средствам администрирования и выберите диспетчер сервера.
    2. В левой области выберите "Компоненты".
    3. Выберите " Добавить компоненты " в правой области.
    4. Выполните одно из следующих действий в соответствии с вашей версией Windows:
      • Для Windows Server 2016 перейдите на сайт Install Server with Desktop Experience.
      • Для Windows Server 2012 и 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 (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\Inetsrvclusweb7.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>