Учебно-методические материалы для студентов кафедры АСОИУ

Расширение функций веб-серверов. Модули ISAPI (IIS) и DSO (Apache)

Модульная архитектура веб-сервера

Изначально, единственным средством выполнения программ на стороне веб-сервера было обращение к ним через общий шлюзовый интерфейс (CGI). Практика показала, что в CGI имеется ряд недостатков, в числе основных — высокие требования к аппаратным ресурсам веб-сервера и высокие накладные расходы на этапах загрузки и выгрузки CGI-приложений. Альтернативным решением стало использование модульной архитектуры веб-серверов, позволяющей расширять их возможности за счет внешних библиотек — модулей.

Модули веб-сервера — это статически или динамически подключаемые библиотеки функций, доступных веб-серверу. В отличие от CGI, модульные расширения быстрее и требуют меньших ресурсов, т.к. многопоточны, т.е. для обработки еще одного запроса не требуется загрузки еще одной копии приложения. Рассмотрим модульные расширения наиболее распространенных веб-серверов: DSO для веб-сервера Apache и ISAPI для Internet Information Services

Apache DSO

Как узнать конфигурацию Apache?

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

<?php
phpinfo(INFO_MODULES);
?>

Веб-сервер Apache имеет открытую модульную архитектуру и его базовые возможности представлены в основном модуле ядра(apache core). Дополнительные возможности вынесены во внешние модули, которые могут быть подключены к ядру статически или динамически. Это позволяет очень тонко настраивать Apache под конкретные задачи, включая в сборку только те функции, которые действительно нужны. Такой подход позволяет управлять производительностью и функциональностью веб-сервера.

Для статического подключения модулей Apache должен быть скомпилирован вместе с кодом нужных модулей. Динамически подключаемые модули добавляют свою функциональность при их загрузке во время запуска/перезапуска веб-сервера. Для динамического подключения модуль должен быть представлен в виде DSO (Dynamic Shared Object). Для поддержки DSO Apache использует опять же модуль, mod_so, который загружает модули в виде разделяемых библиотек или разделяемых файлов. Способ загрузки DSO указывается в конфигурационном файле веб-сервера Apache (httpd.conf) соответствующими директивами:

Модули взаимодействуют с сервером Apache через единый интерфейс. Они регистрируют свои обработчики в ядре Apache или в других модулях. Ядро Apache обращается к этим обработчикам когда это требуется. С другой стороны, модули могут обращаться к функциям и структурам данных ядра через Apache API. Это может потребоваться, например, при передаче данных или выделении памяти.

Модуль Apache прозрачен для пользователя, т.е. не является конечной точкой клиентского запроса, чем напоминает ISAPI-фильтр. Модуль может представлять функции обработки программных прерываний (handlers for hooks), связывания директив конфигурации, фильтрации запроса и дополнительные функции.

Приведем краткое описание некоторых модулей Apache.

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

ISAPI

ISAPI (Internet Server Application Programming Interface) — это набор интерфейсов, предоставляемых веб-сервером MS IIS (Internet Information Services) для написания приложений, взаимодействующих с этим сервером и расширяющих его возможности. Приложения ISAPI представляют собой динамически подключаемые библиотеки (Dynamic Link Library, DLL), напрямую взаимодействующие с API IIS. Приложения ISAPI загружаются и выполняются в адресном пространстве IIS, поэтому серверу не нужно создавать новый процесс при каждом HTTP-запросе. Поскольку Windows загружает динамически подключаемую библиотеку один раз при первом вызове функции в DLL, то приложение ISAPI остается загруженным и не удаляется, пока не будет остановлен/выключен веб-сервер (если включено кэширование ISAPI), либо приложение не будет выгружено явным образом (если кэширование выключено).

Рис. 1. Архитектура ISAPI

Приложения ISAPI могут быть оформлены или в виде расширений, или в виде фильтров.

Основное преимущество ISAPI — в скорости выполнения операций. ISAPI-приложение работает быстрее, чем обычная CGI-программа (которая должна всякий раз загружаться и выгружаться) или скрипт (который сначала должен быть загружен, потом обрабатан интерпретатором, которому, в общем случае, тоже нужно время на загрузку).

Среди недостатков — трудности при отладке ISAPI-приложений. Незамеченная ошибка может привести к нарушению работоспособности не только самой библиотеки dll, но и всего веб-сервера. При разработке ISAPI-приложений на универсальных языках программирования, таких как C++ или Object Pascal еще одной проблемой становится неконтролируемый код. Т.е. разработчик должен сам заботиться об управлении памятью, «сборке мусора» и прочих аспектах системного уровня. Еще один недостаток, пожалуй, самый главный — непереносимость. Несмотря на то, что ISAPI — открытая спецификация и поддержка технологии реализована, например, в модуле mod_isapi.dll для Apache for Win32, нет никакой возможности применять ISAPI на платформах, отличающихся от MS Windows.

CC-BY-SA Анатольев А.Г., 31.01.2012