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


Инициализация приложений в IIS 8.0

Шон Иган

Совместимость

Версия Примечания
IIS 8,0 Инициализация приложения была встроенной для IIS 8.0.
IIS 7,5 Инициализация приложения была выпущена как внеполосный модуль для IIS 7.5.
IIS 7.0 Инициализация приложений не поддерживается для IIS 7.0.

Проблема

Распространенной проблемой, с которой сталкиваются администраторы веб-сайтов, является необходимость выполнения задач инициализации и "прогрева" для веб-приложения. Более крупным и сложным веб-приложениям может потребоваться выполнять длительную обработку запуска, создавать кэши в памяти, создавать содержимое и т. д. перед обслуживанием первого HTTP-запроса.

Решение

Функция инициализации приложений IIS 8.0 позволяет администраторам веб-сайтов настроить IIS 8.0 для упреждающего выполнения задач инициализации для одного или нескольких веб-приложений. Во время инициализации приложения iis 8.0 также можно настроить для возврата статического содержимого в качестве заполнителя или "страницы-заставки", пока приложение не завершит свои задачи инициализации.

Функция инициализации приложений настраивается с помощью сочетания глобальных правил и правил для конкретных приложений, которые сообщают IIS 8.0, как и когда инициализировать веб-приложения. Функция инициализации приложений также поддерживает интеграцию с модулем переопределения URL-адресов IIS для поддержки более сложной обработки содержимого заполнителей во время инициализации приложения.

Примечание

Существуют известные несовместимости между инициализацией приложений и маршрутизацией запросов приложений (ARR). Не рекомендуется использовать инициализацию приложений на компьютерах с установленным ARR.

Пошаговые инструкции

Предварительные требования

Для инициализации приложений требуется установить IIS 8.0. Кроме того, необходимо установить компонент инициализации приложений в подфункционале IIS "Разработка приложений".

На следующем снимка экрана пользовательского интерфейса Windows Server 2012 диспетчер сервера показана функция инициализации приложений.

Снимок экрана: компонент инициализации приложений, установленный на Windows Server 2012.

Примечание

В этом пошаговом руководстве также используется приложение ASP.NET 4.5 для демонстрации функции инициализации приложений. Приложение в конце этого документа содержит пример приложения и инструкции по настройке приложения на компьютере.

Обходные решения для известных ошибок

  • В настоящее время для этой функции нет известных ошибок.

Глобальная инициализация приложений

Функцию инициализации приложений можно настроить в двух местах: файл applicationHost.config на уровне компьютера и файл web.config на уровне приложения. Конфигурация в файле applicationHost.config содержит "глобальные" параметры инициализации приложения, а файл web.config уровня приложения содержит "локальные" параметры инициализации приложения.

В этом пошаговом руководстве вы настроите пример приложения так, чтобы он всегда инициализировался при запуске пула приложений, связанного с приложением. Так как поведение пула приложений можно настроить только в applicationHost.config, запуск инициализации приложений при запуске пула приложений считается частью "глобальных" параметров инициализации приложения.

Изменения в applicationHost.config

Откройте файл applicationHost.config, расположенный по адресу %WINDIR%\system32\inetsrv\config в Блокноте. (Не забудьте запустить текстовый редактор с параметром "Запуск от имени администратора"!)

<Найдите раздел конфигурации applicationPools>, а затем найдите запись пула приложений с именем .NET версии 4.5.

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

<add name=".NET v4.5" startMode="AlwaysRunning" managedRuntimeVersion="v4.0" />

Прокрутите немного вниз в applicationHost.config до элемента конфигурации <sites> . В этом разделе будет <application> запись для примера приложения (инструкции по созданию примера приложения на компьютере см. в приложении). Приложение называется appinit и имеет значение атрибута пути /appinit. Измените запись, <application> добавив выделенный полужирным шрифтом атрибут preloadEnabled , как показано в фрагменте конфигурации, а затем сохраните изменения.

<application path="/appinit" preloadEnabled="true" applicationPool=".NET v4.5">

Если параметр preloadEnabled задано значение true, служба IIS 8.0 отправляет в приложение поддельный запрос при запуске связанного пула приложений. Именно поэтому на предыдущем шаге для параметра startMode пула приложений задано значение AlwaysRunning.

При сочетании пула приложений, который всегда выполняется, и само приложение помечается как всегда получающее поддельный запрос, когда компьютер перезапускается и (или) перезапускается служба World Wide Web, IIS 8.0 гарантирует, что экземпляр пула приложений запущен и что приложение "/appinit" всегда отправляет поддельный запрос для активации приложения для запуска приложения.

Изменения в web.config приложения

С помощью второго экземпляра Блокнота откройте web.config файл на уровне приложения, расположенный в следующем расположении. (Не забудьте запустить текстовый редактор с параметром "Запуск от имени администратора"!)

C:\inetpub\wwwroot\appinit

Примечание. Измените букву диска, если веб-сайт по умолчанию установлен на другом физическом диске.

Файл web.config содержит несколько разделов конфигурации, которые уже заполнены, но закомментированы. Раскомментируйте фрагмент конфигурации, который находится внутри раздела конфигурации <system.webServer> . Этот фрагмент кода находится сразу под комментарием "Упражнение 1 . Шаг 1" в файле web.config. Сохраните изменения.

<applicationInitialization
    remapManagedRequestsTo="Startup.htm" 
    skipManagedModules="true" >
  <add initializationPage="/default.aspx" />
</applicationInitialization>

Элемент applicationInitialization сообщает СЛУЖБАм IIS, что он должен отправить запрос к корневому URL-адресу приложения ("/default.aspx" в этом примере), чтобы инициализировать приложение. Пока СЛУЖБЫ IIS ожидают завершения запроса к /default.aspx, они будут обслуживать "Startup.htm" для всех активных клиентов браузера. "Startup.htm" — это "страница-заставка" для приложения.

Выполнение приложения

В окне командной строки с повышенными привилегиями перезапустите службу World Wide Web Service с помощью следующей команды:

net stop w3svc & net start w3svc

Не забудьте запустить окно командной строки с помощью параметра "Запуск от имени администратора"!

Используя интернет-Обозреватель, перейдите по следующему URL-адресу:

http://localhost/appinit/default.aspx

Браузер в течение первых нескольких секунд возвращает статическую страницу "Startup.htm" с серым фоном, так как это "страница-заставка", настроенная в web.config. Вы можете продолжить обновление страницы в веб-браузере и увидеть, что примерно через восемь секунд (смоделированный с потоком спящего режима в global.asax примера приложения) вы получите "реальное" содержимое для default.aspx с белым фоном. Это означает, что инициализация приложения завершена.

Настройка перезапуска перекрывающихся процессов

IIS 8.0 интегрирует глобальную инициализацию приложений с перекрывающимся перезапуском процессов, выполняя инициализацию приложения в перекрывающихся процессах в фоновом режиме. Когда служба IIS обнаруживает, что активный рабочий процесс перезапускается, СЛУЖБЫ IIS не переключают активный трафик на новый рабочий процесс, пока новый рабочий процесс не завершит выполнение всех URL-адресов инициализации приложений в новом процессе. Это гарантирует, что клиенты, просматривающие ваш веб-сайт, не увидят страницы инициализации приложений после запуска приложения.

Назад к экземпляру Блокнота с applicationHost.config. Измените запись пула приложений для .NET версии 4.5" так, чтобы она выглядела так, как показано ниже.

<add name=".NET v4.5"
                startMode="AlwaysRunning"
    managedRuntimeVersion="v4.0" >
  <recycling logEventOnRecycle="Schedule">
    <periodicRestart requests="30" />
  </recycling>
</add>

Не забудьте сохранить изменения!

Элемент <перезапуска> сообщает IIS, что необходимо перезаработать рабочий процесс каждые 30 HTTP-запросов.

Повторный запуск приложения

В окне командной строки с повышенными привилегиями перезапустите службу World Wide Web Service с помощью следующей команды:

net stop w3svc & net start w3svc

Используя новый экземпляр интернет-Обозреватель, еще раз перейдите по адресу:

http://localhost/appinit/default.aspx

Обратите внимание, что отображается страница-заставка "Startup.htm" с серым фоном.

Затем подтяните диспетчер задач и убедитесь, что отображается вкладка Процессы . Сортируйте список процессов по имени, пока не увидите запущенный экземпляр w3wp.exe. Этот экземпляр является рабочим процессом, в котором в настоящее время выполняется приложение appinit ASP.NET.

Снимок экрана: список процессов диспетчера задач, на котором выполняется один экземпляр исполняемого файла w 3 w p.

Обновите браузер несколько раз, пока не будет возвращено содержимое с реальной страницы default.aspx. Вы знаете, что приложение выполняет "реальную" страницу default.aspx, когда фон меняется на белый. Затем расположите окна на экране, чтобы вы могли видеть диспетчер задач и браузер.

Теперь вернитесь в браузер и обновите страницу не менее 30 раз. Это приведет к перезапуску пула приложений iis. Вы можете остановить обновление страницы, когда вы увидите второй экземпляр w3wp.exe отображается в списке процессов диспетчера задач, как показано ниже:

Снимок экрана: второй экземпляр исполняемого файла w 3 w p в списке процессов диспетчера задач.

Снимок экрана: второй экземпляр w3wp.exe запущен из-за установленного ранее ограничения на переработку процессов.

Вы можете продолжать периодически обновлять окно браузера в течение следующих десяти секунд или около того. Обратите внимание, что default.aspx продолжает работать. После завершения перекрывающейся повторной обработки один экземпляр w3wp.exe исчезает из окна процесс диспетчера задач.

На протяжении всего периода перекрывающейся повторной очистки вы по-прежнему видите содержимое "real" default.aspx, даже несмотря на то, что инициализация приложения была настроена для приложения и выполняла URL-адрес инициализации в фоновом режиме в новом экземпляре w3wp.exe.

Перезапись URL-адресов и инициализация приложений

По умолчанию инициализация приложения позволяет указать только один URL-адрес страницы-заставки для отображения во время инициализации приложения. Однако функция инициализации приложений поддерживает несколько переменных сервера, которые можно использовать для управления обработкой запросов во время инициализации приложения. Это позволяет создавать декларативные правила с помощью модуля переопределения URL-адресов, содержащего более сложные сопоставления с предварительно созданным статическим содержимым.

В этом пошаговом руководстве атрибут remapManagedRequestsTo заменяется набором правил переопределения URL-адресов, которые выполняют тот же конечный результат.

Примечание. Инструкции по установке переопределения URL-адресов см. в приложении.

Изменения в applicationHost.config

Используя экземпляр Блокнота с открытым applicationHost.config, отменить изменения пул приложений и элементы приложения, чтобы отключить все глобальные обработки инициализации приложений. Глобальные параметры удаляются на этом шаге, так как в оставшейся части этого пошагового руководства основное внимание уделяется настроенной реакции на инициализацию приложения.

Записи applicationHost.config для пула приложений и приложения, как показано ниже.

Запись конфигурации пула приложений:

<add name=".NET v4.5" managedRuntimeVersion="v4.0" />

Запись конфигурации приложения:

<application path="/appinit" applicationPool=".NET v4.5">

Не забудьте сохранить изменения по завершении!

Кроме того, чтобы изменения вступили в силу в IIS, в окне командной строки с повышенными привилегиями перезапустите службу World Wide Web Service с помощью следующей команды:

net stop w3svc & net start w3svc

Изменения в web.config уровня приложения

С помощью экземпляра Блокнота с открытым web.config уровня приложения удалите атрибут remapManagedRequestsTo из <applicationInitialization> элемента . Раздел <applicationInitialization> конфигурации теперь должен выглядеть так, как этот фрагмент конфигурации.

<applicationInitialization skipManagedModules="true" >
  <add initializationPage="/default.aspx" />
</applicationInitialization>

<applicationInitialization> Так как элемент больше не определяет URL-адрес для повторного сопоставления запросов, добавьте набор правил переопределения URL-адресов. Затем добавьте правило перезаписи, которое явно сопоставляет запросы, выполненные с default.aspx, а также "/" для маршрутизации на "Startup.htm". Требуются два правила, так как модуль переопределения URL-адресов не знает о том, как работают документы по умолчанию. Так как "/" приравнивается к default.aspx в ASP.NET приложениях, вам потребуется два правила переопределения URL-адресов — по одному для каждого варианта URL-адреса.

Новые правила выделены полужирным шрифтом ниже. Кроме того, можно раскомментировать предварительно заполненные правила переопределения URL-адресов в комментарии "Упражнение 2. Шаг 2. Сопоставление запросов с домашней страницей" в файле web.config.

<rewrite> 
  <rules>
    <rule name="Home Page-Expanded" stopProcessing="true">
      <match url="default.aspx" />
      <conditions>
        <add input="{APP_WARMING_UP}" pattern="1" />
      </conditions>
      <action type="Rewrite" url="Startup.htm" />
    </rule>
    <rule name="Home Page-Short" stopProcessing="true">
      <match url="^$" />
      <conditions>
        <add input="{APP_WARMING_UP}" pattern="1" />
      </conditions>
      <action type="Rewrite" url="Startup.htm" />
    </rule>
  </rules>
</rewrite>

Некоторые элементы, которые следует отметить об этих правилах: во-первых, атрибут stopProcessing имеет значение true в элементе <rule /> . Это необходимо для того, чтобы позже добавить правило перезаписи URL-адресов по всем адресам, а также для запросов к default.aspx или "/", которые не должны выполняться правило catch-all.

Во-вторых, обратите внимание, что у нас есть условие перезаписи URL-адреса в элементе <conditions /> . Это условие фактически означает , что правило применяется только в том случае, если приложение находится в состоянии инициализации. Серверная переменная "APP_WARMING_UP" задается службами IIS значение "1", если инициализация приложения активна, а СЛУЖБЫ IIS по-прежнему обрабатывают все URL-адреса инициализации.

Наконец, обратите внимание, что действие было определено для перезаписи активного запроса, чтобы вместо этого выполнить "Startup.htm". Это правило указывает службам IIS передать запрос в обработчик статических файлов, который затем отображает статическую страницу Startup.htm.

Затем добавьте правило перезаписи catch-all. При использовании модуля переопределения URL-адресов в сочетании с инициализацией приложения правило catch-all, которое срабатывает, если ни одно из предыдущих правил не требуется. Добавьте правило с полужирным шрифтом, показанное ниже, в раздел перезаписи в качестве правила catch-all. Кроме того, можно раскомментировать предварительно заполненное правило catch-all в web.config, который находится в разделе "Упражнение 2. Шаг 2 Настройка правила Catch-All" в файле web.config.

<rewrite> 
  <rules>
    <rule name="Home Page-Expanded" stopProcessing="true">
      <match url="default.aspx" />
      <conditions>
        <add input="{APP_WARMING_UP}" pattern="1" />
      </conditions>
      <action type="Rewrite" url="Startup.htm" />
    </rule>
    <rule name="Home Page-Short" stopProcessing="true">
      <match url="^$" />
      <conditions>
        <add input="{APP_WARMING_UP}" pattern="1" />
      </conditions>
      <action type="Rewrite" url="Startup.htm" />
    </rule>
    <rule name="All Other Requests">
      <match url=".*" />
      <conditions>
        <add input="{APP_WARMING_UP}" pattern="1" />
      </conditions>
      <serverVariables>
        <set name="SKIP_MANAGED_MODULES" value="0" />
      </serverVariables>
      <action type="Rewrite" url="{URL}" />
    </rule>
  </rules>
</rewrite>

Сохраните изменения, когда закончите!

Новое правило соответствует любому URL-адресу, который достигает его, и предписывает СЛУЖБАм IIS продолжить обработку запроса, который был сделан на входящий URL-адрес. Правило также задает для переменной сервера с именем "SKIP_MANAGED_MODULES" значение "0", которое приравнивается к "false". Этот параметр сообщает СЛУЖБАм IIS, что он должен обрабатывать перезаписанный запрос из url-адреса переопределения так же, как если бы запрос обычно поступил вне сети.

Выполнение приложения

В окне командной строки с повышенными привилегиями перезапустите службу World Wide Web Service с помощью следующей команды:

net stop w3svc & net start w3svc

Используя новый экземпляр интернет-Обозреватель, еще раз перейдите к:

http://localhost/appinit/default.aspx

Несмотря на то, что правила переопределения URL-адресов теперь используются для определения логики страницы-заставки, вы по-прежнему видите такое же поведение из первого пошагового руководства. Изначально отображается страница Startup.htm с серым фоном. Если вы периодически обновляете браузер, примерно через восемь секунд вы снова увидите, что фон страницы переключится на белый, что указывает на то, что "реальная" страница default.aspx обслуживается после завершения инициализации приложения.

Сложные правила страниц-заставок

В предыдущих пошаговых руководствах инициализация приложения используется как прямое сопоставление URL-адресов "X" с URL-адресом "Y". В этом пошаговом руководстве вы реализуете более сложный сценарий инициализации приложения.

В браузере перейдите по обоим следующим URL-адресам:

  • http://localhost/appinit/ImageHandler.ashx?image=Lighthouse
  • http://localhost/appinit/ImageHandler.ashx?image=Tulips

Эти URL-адреса являются примерами динамически создаваемого статического содержимого. Для этого примера приложения код внутри ImageHandler.ashx просматривает ключ querystring "image". Если значение этой строки запроса равно Lighthouse или Tulips, обработчик ASP.NET передает соответствующий jpg,расположенный в папке App_Data.

Так как обработчик образов просто возвращает образы, вы хотите иметь возможность продолжать возвращать соответствующий образ даже во время инициализации приложения. Хотя механизм обслуживания этих образов использует управляемый код, вам может потребоваться быстро предоставлять предварительно созданные образы клиентам, даже если базовому ASP.NET приложению требуется много времени для запуска и инициализации.

Изменения в web.config уровня приложения

Используя экземпляр Блокнота с открытыми web.config уровня приложения, добавьте еще одно правило перезаписи URL-адресов перед окончательным правилом catch-all. Новый добавляемый фрагмент кода показан ниже. Кроме того, можно раскомментировать предварительно заполненное правило обработчика изображений в web.config, который находится в комментарии "Упражнение 3. Сложные правила страницы-заставки" в файле web.config.

<rule name="Image Handler Remapping" stopProcessing="true">
  <match url="ImageHandler.ashx" />
  <conditions>
    <add input="{APP_WARMING_UP}" pattern="1" /> 
    <add input="{QUERY_STRING}" pattern="image=([A-Za-z]+)&amp;?" /> 
  </conditions>
  <action type="Rewrite" url="Images/{C:1}_static.jpg" appendQueryString="false" />
</rule>

По завершении сохраните изменения.

Как и в случае с правилами перезаписи для default.aspx и "/", это правило имеет атрибут stopProcessing , равный true, чтобы гарантировать, что запросы к ImageHandler.ashx случайно не попадают в окончательное правило перезаписи catch-all во время инициализации приложения.

Для запросов к ImageHandler.ashx правило перезаписи использует группу отслеживания регулярных выражений для извлечения запрошенного изображения из строки запроса. Определение шаблона соответствия pattern="image=([A-Za-z]+)&?" указывает IIS извлечь значение переменной строки запроса image. Затем это значение используется в атрибуте url-адреса атрибута действия: url="Images/{C:1}_static.jpg".

Атрибут url в элементе action указывает модулю Перезапись URL-адресов перезаписывать запросы ImageHandler.ashx, чтобы они указывали на файлы в подкаталоге Images приложения. Кроме того, значение строки запроса, записанное регулярным выражением, используется для формирования имени файла, который в конечном итоге будет обслуживаться из подкаталога Images. Например, запрос к ImageHandler.ashx?image=Tulips будет переписан в Images/Tulips_static.jpg.

При переходе к каталогу inetpub\wwwroot\appinit с помощью Windows Обозреватель и в подкаталоге Images отображаются два файла: один представляет "статическую" версию Tulips.jpg, а другой — "статическую" версию Lighthouse.jpg. Эти статические образы действуют как предварительно созданное содержимое, которое можно обслуживать во время инициализации приложения.

Выполнение приложения

В окне командной строки с повышенными привилегиями перезапустите службу World Wide Web Service с помощью следующей команды:

net stop w3svc & net start w3svc

Используя интернет-Обозреватель перейдите по адресу:

http://localhost/appinit/ImageHandler.ashx?image=Lighthouse

или

http://localhost/appinit/ImageHandler.ashx?image=Tulips

Обратите внимание, что изображения, возвращаемые в любом случае, содержат водяной знак, указывающий, что это "статические" предварительно созданные версии образов. Подложка — это текст в верхней части изображения с надписью "Это изображение является статической версией...."

Если вы обновите браузер примерно через 10 секунд, вы увидите, что возвращенное содержимое изображения изменится на "реальное" содержимое, обслуживаемое обработчиком ImageHandler.ashx. Водяной знак исчезает, который указывает, что содержимое теперь динамически создается обработчиком ASP.NET, так как приложение завершило инициализацию.

[Примечание. Если интернет-Обозреватель не обновляется, щелкните значок "неработающий документ" в адресной строке или значок обновления, чтобы перезагрузить страницу Обозреватель Интернета.]

Сводка

Функция инициализации приложений IIS 8.0 предоставляет разработчикам и администраторам возможность возвращать статическое содержимое в браузеры, пока IIS инициализирует "холодное" приложение. Немедленное обслуживание статического содержимого в браузерах позволяет клиентам улучшить взаимодействие с пользователем. Вместо приложений с холодным запуском, которые приводят к пустой странице браузера или значку вращающегося ожидания, функцию инициализации приложений можно использовать для обслуживания соответствующего статического содержимого, пока базовое приложение завершает дорогостоящую обработку инициализации.

Процесс инициализации может происходить автоматически при подключении веб-сервера к сети или перезапуске. В сценариях, когда администраторы сервера не хотят жадно инициализировать приложения, процесс инициализации можно активировать по запросу, когда первый запрос поступает в "холодное" приложение.

Для инициализации как глобального, так и локального приложения можно интегрировать модуль переопределения URL-адресов, чтобы предоставить более широкие и сложные правила инициализации. С помощью правил переопределения URL-адресов, интегрированных с функцией инициализации приложений, можно обслуживать различные типы предварительно созданного статического содержимого для различных URL-адресов и виртуальных путей, пока IIS продолжает запускать приложение в фоновом режиме.

Приложение. Настройка примера приложения ASP.NET

Примечание. В следующих шагах предполагается, что на сервере уже установлены службы IIS 8.0 и ASP.NET 4.5 для использования в IIS 8.0.

Распаковка примера приложения

Пример приложения ASP.NET содержится в следующем файле .zip:

Распакуйте файл в папку wwwroot на веб-сервере. Например, если веб-сервер установил веб-сайт по умолчанию на диске C:\, распакуйте содержимое файла в c:\inetpub\wwwroot\appinit.

Создание приложения в IIS 8.0

Распакутив пример appinit в файловую систему, необходимо настроить папку как приложение ASP.NET в IIS 8.0. На снимке экрана ниже показан пример приложения appinit, настроенный в качестве приложения в IIS 8.0. Также обратите внимание, что приложение назначено пулу приложений .NET версии 4.5".

Снимок экрана: меню

Установка модуля переопределения URL-адресов

В примере приложения используется модуль переопределения URL-адресов для расширенной интеграции с функцией инициализации приложений. Необходимо установить модуль переопределения URL-адресов на сервере; Его можно скачать по следующей ссылке: https://www.iis.net/downloads/microsoft/url-rewrite.

Настройка модуля переопределения URL-адресов

После установки модуля переопределения URL-адресов на веб-сервере необходимо изменить файл applicationHost.config IIS, чтобы разрешить использование переменной сервера SKIP_MANAGED_MODULES, поддерживаемой функцией инициализации приложений.

Откройте файл applicationHost.config на уровне компьютера в текстовом редакторе, например в Блокноте. Например, если вы установили операционную систему на диск C:\, файл applicationHost.config находится по адресу C:\Windows\System32\inetsrv\config.

Прокрутите файл вниз и найдите раздел безопасности. Этот раздел начинается с элемента Xml: <security>.

Перед элементом<безопасности> введите следующие xml-элементы:

<rewrite>
  <allowedServerVariables>
    <add name="SKIP_MANAGED_MODULES" />
  </allowedServerVariables>
</rewrite>

Сохраните изменения в файле applicationHost.config.