Вопросы по mod_perl
| |
|
Mod_perl - проект интеграции Apache/Perl объединяющий всю мощь языка программирования Perl
и http-серверa Apache. В результате данной интеграции появился удобный объектно-ориентированный
интерфейс к средствам Apache API. Главное преимущество mod_perl - мощность и скорость. Вы получаете
полный доступ ко внутренним ресурсам сервера и можете изменять его работу на любом этапе запроса
-обработки. Например, модифицировать процедуры аутентификации, логинга, обработки запроса. Mod_perl
включает в себя универсальный модуль(Apache::Registry), который позволяет запускать уже написанные
на perl CGI-скрипты через mod_perl, что существенно ускоряет их работу за счет кэширования
скомпиленного кода. Т.е. perl-скрипт компилируется один раз, полученный код кэшируется и при
следующих обращениях к скрипту отпадает необходимость в его компиляции. Важно отметить тот факт,
что отслеживается изменения кэшируемых скриптов, и не возникает проблемы с "закэшировавшимися"
скриптами.
С помощью mod_perl Вы можете сконфигурировать ваш httpd сервер и обработчики в Perl
(использование PerlSetVar, и <Perl> секции). Вы можете даже определить Ваши собственные
директивы конфигурации.
Некоторые пользователи используют на своих серверах perl-скрипты, которые требуют достаточно
большое количество ресурсов от хостинговой машины. Как правило, это большие конференции. На наших
машинах действуют ограничения на количество процессорного времени занимаемого одним процессом.
В связи с данным ограничением возможна некорректная работа некоторых скриптов, которые недостаточно
оптимизированы. Выйти из данной ситуации можно несколькими способами. Одним из способов является
использование mod_perl. Вам даже не нужно вносить серьезных изменений в Ваши скрипты. Некоторые
сложности, с которыми можно столкнуться при миграции с CGI на mod_perl описаны в разделе
"Как
запускать cgi-скрипты с использованием mod_perl?". Если Вы хотите получить доступ к ресурсам
Apache API, то Вам необходимо писать mod_perl модуль. Более подробно данный вопрос описывается в
разделе "Как написать свой mod_perl модуль?".
Для использования mod_perl как замены CGI, рекомендуется внести следующие изменения в
конфигурацию сервера:
В файл httpd.conf (или httpd2.conf, если Вы используете Apache 2.2) добавьте следующие строки:
Alias /perl/ /real/path/to/perl-scripts/
<Location /perl>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
</Location>
Необходимо использовать именно директиву Alias, т.к. директива ScriptAlias c mod_perl не
работает. После рестарта сервера все обращения к скриптам расположенным в директории
/real/path/to/perl-scripts/ будут обрабатываться модулем Apache::Registry. Обращаться к
скриптам нужно следующим образом:
http://www.yourname.com/perl/script.pl
Если Вы хотите, чтобы все perl-скрипты работали через mod_perl, то можно взять за основу
расширения файлов. Внесите в httpd.conf (или httpd2.conf, если Вы используете Apache 2.2) следующие строки:
<Files ~ "\.pl$">
SetHandler perl-script
PerlHandler Apache::Registry
Options ExecCGI
</Files>
и все файлы на Вашем сервере, имеющие расширение .pl будут обрабатываться
через mod_perl как скрипты.
При миграции на mod_perl необходимо учитывать, что переносимый скрипт должен соответствовать
некоторым требованиям. В скрипте не должны использоваться:
- директива require, так как Вы не сможете получить доступ к переменным и процедурам
требуемого модуля,
- директивы _DATA_ и _END_,
- функция exit(). Вместо нее используется Apache::exit() (или Apache2::exit(), если Вы используете Apache 2.2)
Если Ваш скрипт удовлетворяет данным требованиям, то проблем с его запуском не возникнет.
Для начала необходимо написать, собственно сам модуль. Для примера возьмем следующий
модуль (Test.pm):
package Test;
use CGI qw(:all);
sub handler {
print header, start_html('Handler1 in work');
print h2("Hello world!"),br('Test1');
print end_html;
}
sub another_handler {
print header, start_html('Handler2 in work');
print h2("Hello world!"),br('Test2');
print end_html;
}
Данный модуль содержит два обработчика (хэндлера). Теперь добавим в файл
конфигурации секцию <Perl>:
# Начало секции
<Perl>
# В данной строке описываются директория,
# в которой будут лежать модули
unshift(@INC, '/bhome/part1/01/askweb/proff/mod/');
# Список модулей (если модулей несколько
# указывать через запятую)
@PerlModule = ('Test' );
# Описание хэндлеров и URI.
%Location = (
# При обращении к /test1
'/test1' => {
# Вызывается процедура handler из
# модуля Test.
'PerlHandler' => 'Test',
'SetHandler' => 'perl-script'
},
# При обращении к /test2
'/test2' => {
# Вызывается процедура another_handler
# из модуля Test.
'PerlHandler' => 'Test::another_handler',
'SetHandler' => 'perl-script'
}
);
# Завершение секции.
</Perl>
Необходимо знать, что если при описании URI какой-либо конкретный хэндлер не указан,
а просто указан модуль, то в этом модуле будет запускаться процедура handler.
Также важным момент является то, что после внесения изменений в модуль необходимо рестартовать сервер.
В принципе, можно убрать эту необходимость используя специальный модуль Apache::StatINC, документацию на
который можно получить, дав команду в Unix-shell:
perldoc Apache::StatINC
Внимание !
Если Ваши скрипты mod_perl были написаны под Apache 1.3, то при смене версии веб-сервера
быстрее всего данные скрипты работать перестанут, т.к. в Apache 2.2 используется
mod_perl2.
Необходимо вручную править синтаксис скриптов, подробный список изменений можно найти
в официальной документации :
http://perl.apache.org/docs/2.0/user/porting/compat.html
Ниже приводится список полезных ссылок на сайты посвященные mod_perl.
http://perl.apache.org - главный сайт разработчиков mod_perl,
http://perl.apache.org/docs/index.html - документация по mod_perl