Начало: «
Windows 10, IIS 10: доступ к файлам, часть 1 (основы, термины)».
Архитектура веб-сервера IIS 10 в теории
Вот схема работы (архитектуры) веб-сервера IIS из
документации на сайте компании «Microsoft»:
Эта схема интересна, но не слишком понятна, пока не посмотришь, как она работает на практике. Ниже я попытаюсь это сделать.
Архитектура веб-сервера IIS 10 на практике
Как видно из рисунка выше, программа-сервер IIS 10 реализована в операционной системе «Windows 10» в качестве службы (на самом деле, нескольких служб). «Службой» называют программу, которая работает на компьютере постоянно, в фоновом режиме ожидая запросов от пользователя или других программ. Некоторые службы могут быть запущены по запросу (вручную), другие же запускаются автоматически (при начале работы операционной системы). Программа-сервер IIS 10 запускается автоматически, при начале работы операционной системы.
Все службы (когда они запущены) в списке процессов отображаются именем «svchost.exe» (название этой программы расшифровывается как «Service Host»,
тут подробнее). Список процессов, запущенных на компьютере, можно посмотреть в программе «Диспетчер задач» (я ее запускаю комбинацией клавиш «Ctrl+Shift+Esc»). Если вы когда-нибудь заглядывали в эту программу, то, думаю, замечали в списке процессов множество позиций с именем «svchost.exe». Так много их потому, что на компьютере постоянно запущено и работает множество разных служб. Одна программа «svchost.exe» может «хостить» (служить главным процессом) и для одной, и сразу для нескольких служб.
Следует отметить, что в программе «Диспетчер задач» есть ряд вкладок, из которых для нас на данный момент интересны первая, которая называется «Процессы», и две последние, которые называются «Подробности» и «Службы». Вот как они выглядят у меня:
Окно программы «Диспетчер задач», вкладка «Процессы»:
Окно программы «Диспетчер задач», вкладка «Подробности»:
Окно программы «Диспетчер задач», вкладка «Службы» (из этой вкладки, внизу, по ссылке «Открыть службы», можно открыть сохраненную консоль «Службы» [файл «services.msc»] программы «mmc.exe»):
Как видно из иллюстраций, приведенных выше, один процесс с идентификатором 3392 и с именем «svchost.exe» хостит (является главным процессом) сразу две службы: «WAS» и «W3SVC» (это соответствует схеме из документации с сайта компании «Microsoft», приведенной в начале данного поста). Понятно, что идентификатор 3392 тут не имеет значения, он назначается случайным образом при запуске процесса, его удобно использовать, чтобы сопоставить строки на разных вкладках программы «Диспетчер задач».
Название службы «WAS» расшифровывается как «Windows Activation Service» (по-русски «Служба активации Windows»), а точнее «Windows Process Activation Service». Название немного запутывает: имеется в виду не активация операционной системы «Windows», а запуск некоторых процессов операционной системы «Windows». Эта служба используется и для веба (протоколы HTTP и HTTPS) и для сетевого общения по другим протоколам. Как видно из схемы из начала данного поста, служба «WAS» получает настройки веб-сервера IIS из главного файла настроек «applicationHost.config» и вводит эти настройки в действие.
Название службы «W3SVC» расшифровывается как «World Wide Web Publishing Service», по-русски «Служба веб-публикаций».
Работая вместе, эти две службы в случае необходимости запускают так называемые «рабочие процессы» (по-английски «worker process») веб-сервера IIS.
Отмечу, что и главный процесс «svchost.exe», и хостящиеся на нем службы «WAS» и «W3SVC» по умолчанию запускаются от имени учетной записи пользователя «СИСТЕМА» (это видно на одной из иллюстраций выше, на вкладке «Подробности» программы «Диспетчер задач»). Эту учетную запись вы не найдете в списке пользователей в программе (сохраненной консоли программы «mmc.exe») «Управление компьютером». Но это одна из служебных встроенных учетных записей операционной системы (
тут подробнее).
Рабочие процессы веб-сервера IIS, пулы приложений
Две вышеописанные службы «WAS» и «W3SVC» не обеспечивают саму работу сайтов и веб-приложений, находящихся под управлением веб-сервера IIS. Для каждого отдельного сайта и/или веб-приложения можно назначить запуск отдельного процесса, который называют «рабочим процессом», уже упомянутым выше. Это делается с помощью так называемого «пула приложений» (по-английски «application pool»). Грубо говоря, каждый рабочий процесс веб-сервера IIS соответствует своему пулу приложений.
Отдельные пулы приложений (отдельные рабочие процессы) для отдельных сайтов и/или веб-приложений придумали для обеспечения безопасности. При такой архитектуре один сайт не может вмешаться в работу другого сайта и/или веб-приложения, если они используют разные пулы приложений. Тут всё зависит от настроек: можно настроить работу веб-сервера так, что к одному пулу приложений будет привязано несколько сайтов и/или веб-приложений. Либо можно для каждого сайта и/или веб-приложения создавать свой собственный пул приложений. Эти настройки можно выполнить в программе «Диспетчер служб IIS».
Даже статический сайт на веб-сервере IIS работает через пул приложений. Мы рассматриваем настройки веб-сервера IIS по умолчанию, поэтому будем говорить про сайт «Default Web Site», который был создан автоматически по умолчанию при включении веб-сервера IIS. Если посмотреть в его основных настройках, он привязан к пулу приложений «DefaultAppPool», который тоже был создан автоматически по умолчанию при включении веб-сервера IIS.
Посмотрим, как это работает на практике. У меня в корневой папке сайта «Default Web Site» размещена простая HTML-страница «index.html». То есть это, можно сказать, маленький статический сайт. Я открываю браузер и перехожу по URL-адресу
http://localhost/, после чего браузер отображает упомянутую HTML-страницу «index.html». Чтобы это произошло, рассмотренные выше две службы «WAS» и «W3SVC» обеспечивают запуск рабочего процесса для пула приложений «DefaultAppPool», через который работает мой маленький статический сайт «Default Web Site». Этот рабочий процесс обладает именем «w3wp.exe».
После перехода на статическую HTML-страницу рабочий процесс «w3wp.exe», соответствующий определенному пулу приложений, можно увидеть на вкладках «Процессы» и «Подробности» программы «Диспетчер задач». Или открыв функцию «Рабочие процессы» веб-сервера IIS в программе «Диспетчер служб IIS». Вот как это выглядит у меня:
Как видно на иллюстрации с вкладкой «Подробности» программы «Диспетчер задач» выше, рабочий процесс «w3wp.exe», представляющий пул приложений «DefaultAppPool», запущен от имени учетной записи пользователя «DefaultAppPool» (это по умолчанию, а вообще эта настройка может быть изменена). Для каждого пула приложений на веб-сервере IIS имеется своя встроенная учетная запись, имя которой совпадает с именем пула приложений. Следует иметь в виду, что, опять же, как и в случае с учетной записью «СИСТЕМА», описанной ранее в этом посте, встроенные учетные записи пулов приложений не показаны в списке пользователей в программе (сохраненной консоли программы «mmc.exe») «Управление компьютером».
Кроме этого, отмечу, что рабочий процесс «w3wp.exe» не остается запущенным постоянно, как службы «WAS» и «W3SVC», а через некоторое время (минут через пятнадцать у меня) исчезает из списка запущенных процессов. То есть он завершается, если от браузера не поступает новых HTTP-запросов к пулу приложений, который представляет данный процесс «w3wp.exe».
Процессы, запускаемые веб-сервером IIS для скриптов на языке PHP
Выше я описал работу веб-сервера IIS для статического сайта. А как веб-сервер IIS работает в случае динамического сайта? Для примера я поместил в корневую папку сайта скрипт на языке PHP в файле «phpinfo.php». Напомню, у меня установлен интерпретатор PHP версии 8.1.10 и он настроен для работы с веб-сервером IIS. Я открыл страницу с этим скриптом в браузере по URL-адресу
http://localhost/phpinfo.php, скрипт сформировал HTML-страницу так, как от него ожидалось. После этого я посмотрел, какие процессы появились в списке процессов в программе «Диспетчер задач» на вкладках «Процессы» и «Подробности». Вот что у меня там оказалось:
Как видно из иллюстраций, приведенных выше, как и в случае с статическим сайтом, тут тоже запустился рабочий процесс «w3wp.exe», представляющий пул приложений «DefaultAppPool» (хотя я могу разместить веб-приложение в отдельной папке и создать для него отдельный пул приложений, если мне этого захочется). Кроме этого, запустился еще процесс «php-cgi.exe», связывающий веб-сервер IIS и интерпретатор PHP через интерфейс FastCGI.
Отмечу, что порядок запуска процессов такой: «svchost.exe» запускает «w3wp.exe» (пул приложений), а «w3wp.exe», в свою очередь, запускает «php-cgi.exe». Если дальнейших запросов от браузера не поступает, процессы «w3wp.exe» и «php-cgi.exe» через некоторое время (у меня минут через пятнадцать) автоматически завершаются и исчезают из списка процессов в программе «Диспетчер задач».
Как видно на иллюстрации выше, процесс «php-cgi.exe» по умолчанию тоже запускается от имени учетной записи пользователя «DefaultAppPool», это та же учетная запись, от имени которой запущен процесс «w3wp.exe». Если открыть функцию «Рабочие процессы» в окне программы «Диспетчер служб IIS», в этом окне будет отображен только процесс «w3wp.exe», а процесс «php-cgi.exe» там отображен не будет (его видно только в программе «Диспетчер задач»).
Продолжение следует.