Как написать свой собственный обработчик (handler) Apache, используя mod_perl? Краткий обзор

  1. Создание обработчика
  2. Запуск обработчика
  3. Полезные ссылки

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

Подключенный к серверу, mod_perl предоставляет Perl-интерфейс к API Apache. Благодаря Perl-интерфейсу API Apache можно получить доступ к внутренней деятельности Apache из perl-скриптов.

Физически Apache Perl API представляет собой модуль, который работает под управлением mod_perl
- Apache.pm. Apache.pm и еще несколько модулей, включены в пакет поставки mod_perl.

Apache Perl API позволяет создавать обработчики Apache на Perl для любой фазы обработки запроса.

Создание обработчика

Внутренняя структура обработчика на perl представляет собой обычный модуль, со специальным методом внутри - sub handler.

Пример кода обработчика:

Если метод обработчика имеет отличное от handler() - название, необходимо сделать соответствующие дополнения при конфигурировании сервера.

Для реализации взаимодействия с Apache подключаем основной модуль - Apache.pm, и дополнительные
(Apache::Constants, Apache::Connection, Apache::Server и т.д.) - по необходимости.

Согласно неофициальным стандартам, модуль создаваемого обработчика помещается в пространство имен Apache (package Apache::).

При вызове обработчика Apache передает ему информацию о текущей транзакции и конфигурации сервера, в виде ссылки на объект. Обработчик может манипулировать этими данными по своему усмотрению.
Согласно сложившимся традициям, ссылка на объект передается переменной, которую называют $r.

После завершения работы, метод handler должен вернуть серверу определенный статусный код. Для удобства работы с кодами можно использовать модуль Apache::Constants.

Запуск обработчика

Для задания perl-обработчика определенному этапу обработки запроса, в конфигурационном файле сервера (httpd.conf) используются директивы Perl*Handler. Название каждой директивы позволяет однозначно определить, для какой стадии обработки запроса назначен обработчик.

Директивы Perl*Handler предоставляются mod_perl, и не доступны на сервере, где mod_perl не установлен.

Список допустимых директив Perl*Handler:

  • PerlChildInitHandler
  • PerlPostReadRequestHandler
  • PerlInitHandler
  • PerlTransHandler
  • PerlHeaderParserHandler
  • PerlAccessHandler
  • PerlAuthenHandler
  • PerlAuthzHandler
  • PerlTypeHandler
  • PerlFixupHandler
  • PerlHandler
  • PerlLogHandler
  • PerlCleanupHandler
  • PerlChildExitHandler

Пример подключения обработчиков:

Обработчик perl-script, указанный директивой SetHandler, означает, что запросы к файлам каталога /home/aninatalie/aninatalie.ru/cgi будут обрабатываться с помощью mod_perl. Директива PerlInitHandler назначает обработчик Apache::StatINC для стадии запроса "Header parsing". Для стадии генерации содержимого и ответа клиенту, директивой PerlHandler назначается обработчик Apache::Registry.

Стоит отметить, что директивы Perl*Handler не обеспечивают автоматическую загрузку модуля обработчика. Для загрузки модуля необходимо предварительно использовать директиву PerlModule.

Полезные ссылки

Что такое обработчик (handler) Apache?

Архитектура Apache Module API

http://xpoint.ru/forums/programming/perl/mod_perl/faq.xhtml