WAS в IIS 8

3 комментария

сервер, iis

Про столь важный компонент IIS’a WAS (Windows Process Activation Service) в рунете написано… Да мало что написано! 🙂 , есть только статья на Хабре про конвейер запросов в IIS, где WAS таки была затронут. Поэтому пришлось в основном собирать информацию с англоязычных сайтов. WAS появился в IIS 7 и был призван обеспечить управление, защиту от сбоев, мониторинг работы приложений, работающих не только по HTTP. Итак, что же делает служба, называемая в русском переводе «Служба активации Windows»?

Глобальная  архитектура WAS

На сайте Microsoft можно найти описание общей архитектуры WAS.

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

  1. Адаптеры прослушивателей
  2. Собственно WAS
  3. Процессы W3WP
  4. Менеджер приложений
  5. Хендлеры протоколов

Адаптеры прослушивателей принимают пришедший на сервер запрос, затем обращаются к WAS, чтобы тот марштутизировал пришедший запрос в нужное приложение. Среди них необходимо выделить следующие адаптеры: W3SVC (запросы HTTP), NetTcpActivator (транспорт TCP), NetPipeActivator (транспорт именованных каналов), NetMsmqActivator (транспорт очереди MSMQ).

Менеджер приложений управляет пулами приложений.

Хендлеры протоколов описывают компоненты протоколов, которые позволяют связать конкретный апаптер прослушивателя и приложение. Точнее, чтобы то поняло запрос 🙂  Вот ссылка на источник.

Далее мы будем рассматривать непосредственно WAS (пункт 2).

Чем занимается WAS?

WAS при получении запроса IIS’ом способен активировать рабочий процесс (on-demand activation). В течение жизни процесса WAS посылает ему специальные сообщения (health messages), на которые ожидает ответ. Если процесс за определенное время не отвечает, то WAS считает, что с процессом что-то не так и рестартует его или просто останавливает. Например, процесс может перестать отвечать на запросы WAS в результате возникшего дедлока, который без рестарта процесса было бы не разрешить.

Начиная с седьмой версии в IIS встроена система защиты от частых сбоев (Rapid Fail Protection). Для каждого пула приложений ее можно настроить отдельно. Возьмем пул приложений ASP.NET v4.0 и посмотрим соответствующие настройки.

Rapid Fail Protection, application pool

Как видно на рисунке слева, в дополнительных параметрах аппула есть раздел защиты от частых сбоев. В нем есть три главных параметра — состояние, интервал сбоев в минутах и максимум сбоев. Если защита включена, то пул приложений начинает следить за количеством ошибок, произошедших за интервал, указанных в этих настройках. Если их количество превысило заданный порог, пул приложений останавливается. Так, например, если приложение при старте не отвечает WAS в течение определенного времени (раздел «Модель процесса», параметр «Предельное время запуска» тех же настроек), то WAS имеет полное право «убить» процесс, а счетчик сбоев пула приложений увеличивается на один. То же самое касается и времени завершения процесса. Сразу после этого идет запись в логи Windows.

WAS следит за тем, какие ресурсы выделены процессу и как он их использует, например, лимитирует использование процессом CPU.

Также WAS создает для каждого пула приложений уникальный SID, который выглядит как «учетная запись», при помощи которой пул приложений, например, может читать свои настройки, к которым имеет доступ еще и администратор сервера (больше никто из пользователей компьютера). Это сделано для изоляции пулов приложений друг от друга. В реальности никаких дополнительных учетных записей на компьютере, под которыми мог бы зайти человек, не создается 🙂 .  Настройки пула приложений создаются «на лету» при его старте и размещаются тут %systemdrive%\inetpub\temp\appPools.

Права на чтение конфигурационного файла пула приложений

На рисунке слева видно, кто может читать настройки пула приложений ASP.NET v4.0. Как видно, учетная запись ASP.NET v4.0 в наличии :-).  Маленькая консольная программа Application Pool SID поможет увидеть Вам SID’ы Ваших пулов приложений, которую можно скачать в виде zip-архива. Внимание, она требует административных прав, так как для ее работы необходим доступ к файлу redirection.config, а также .NET не ниже 2.0.

Исходники ее — никакой не секрет 🙂 , также выкладываю их в виде архива.

 Как убедиться, что WAS есть и служба работает

Чтобы проверить, запущен ли WAS на конкретной машине, достаточно набрать открыть окно «Выполнить», в нем набрать команду cmd, откроется окно консоли, в которой надо набрать комманду sc query was . Если все хорошо, будет примерно такой ответ:

Если служба остановлена, то ответ будет примерно таким:

Чтобы остановить службу WAS, в консоли cmd, запущенной под правами администратора (!!!), надо набрать команду net stop was и согласиться с остановкой службы. Чтобы обратно запустить — net start was.

Если хочется увидеть все это в графическом режиме, то тогда набираем в окне «Выполнить» команду services.msc. Перед нами открывается окно сервисов Widows (рис. ниже).

services

Здесь нас интересует служба под названием «Служба активации Windows». Как видно, стартует она под системной учетной записью по умолчанию. Среди зависимостей у данной службы указывается компонент удаленного вызова процедур RPC.

Архитектура WAS

WAS архитектурно можно разделить на три части:

  1. Менеджер конфигурации
  2. Менеджер процессов
  3. Интерфейс адаптера прослушивателя

Рассмотрим каждую часть более подробно.

Менеджер конфигурации

При помощи менеджера конфигурации WAS обращается к конфигурационному файлу applicationhost.config, расположенному по адресу %windir%\system32\inetsrv\config\, считывает оттуда информацию. В этом файле собраны настройки IIS, отдельных пулов приложений, включая и аутентификационную информацию (да, пароль зашифрован алгоритмом AES, судя по данным схемы IIS_schema.xml, расположенной в подпапке schema), информация по отдельным прослушивателям, по приложениям, имеющимся привязкам, модулям и т.д. Подробное описание этого файла, пожалуй, тема для отдельной статьи 🙂

Далее в свете обработки запроса, пришедшего на IIS, рассмотрим две оставшиеся части.

Менеджер процессов

Инициализацией нового рабочего процесса W3WP занимается менеджер процессов. WAS загружает в рабочий процесс хост приложения, в который уже средствами ASP.NET подгружается CLR. В рабочий процесс WAS подгружает обработчики протоколов процессов (PPH). Далее менеджер приложения ASP.NET создает необходимые домены приложений, загружает в них рабочий код, затем подгружает обработчики протоколов уровня приложения (ADPH).

Интерфейс адаптера прослушивателя

Интерфейс адаптера прослушивателя служит для обработки WAS’ом не-HTTP/HTTPS запросов.

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

WAS создает для каждого приложения определенный ID канала прослушивателя, связанный с запросом для их однозначного связывания.

После произведенных настроек адаптер переходит к процессу прослушивания траффика. По мере прихода сообщений процесс прослушивателя строит «таблицу маршрутизации», которая позволяет связать ID канала прослушивателя и входящие запросы.

Прослушиватель считывает пришедшие байты на сокет. На данном этапе его интересует больше всего информация, которая позволит опеределить, куда дальше посылать пришедшее 🙂 . Для этого он разбирает URL запроса, просматривает свои настройки на предмет совпадения  этого URL и адреса одной из служб. Если таковая найдена, то из настроек вытягивается ID канала прослушивателя. Затем процесс прослушивателя вызывает определенный метод интерфейса адаптера прослушивателя WAS  (WebhostOpenListenerChannelInstance), который заставляет уже рассмотренный менеджер процессов инициировать новый рабочий процесс W3WP. В число параметров данного метода входит ID канала прослушивателя, байтовый массив данных, полученных адаптером, ID пула приложений, куда отправлять запрос, а также хендл протокола.

Когда созданный внутри рабочего процесса хост приложения получает от WAS запрос на поднятие нового канала прослушивания в виде вызываемого метода StartProcessProtocolListenerChannel , он обращается к тому же WAS за настройками, а именно за ключом протокола (например, net.tcp), затем пытается его «распознать». Когда ему это удалось, он в основном домене приложения вызывает метод StartListenerChannel. Данный метод принимает два параметра и они оба — интерфейсы! 🙂 Первый из них имеет тип  IListenerChannelCallback — обратный вызов для канала прослушивателя, второй IAdphManager — диспетчер обработчика домена приложений. Уже загруженный в процесс PPH (см. менеджер процессов) запрашивает у WAS массив данных, который тот заботливо сохранил в момент создания рабочего процесса после вызова метода WebhostOpenListenerChannelInstance. Поскольку куда отправлять данные уже давно известно, то этот массив данных отправляется в нужное приложение.

Итак, как видно, тема не маленькая, вполне возможно, что в каких-нибудь последующих статьях я продолжу рассмотрение WAS.


3 комментария “WAS в IIS 8”

  1. bringman

    У меня в Windows 8 консоль управления IIS’ом глючит… Приходится перезагружать командами, указанными в статье

    Ответить
    • Admin

      Ждем обновлений IIS =)

      Ответить
  2. У меня скрипт написан для этого. Когда создаешь новый пул приложений, приходится помимо этой процедуры, еще и консоль IIS перезагружать =((

    Ответить

Оставьте комментарий

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url=""> <img src="" alt="" class="" width="" height="">

http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ab.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ac.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ag.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ah.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ai.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ak.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/am.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/an.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ao.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/aq.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ar.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/at.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/av.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/aw.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ay.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/az.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/bb.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/bc.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/bd.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/be.gif 
больше...