Краткое введение в mod_per

Опубликовано 11.01.2010

Автор: A brief introduction to mod_perl
Перевод: Сгибнев Михаил

 Apache в настоящее время является самым популярным web-сервером. Хотя имеется альтернатива, Apache является первым, кто смог предоставить реальный контроль, гибкость и возможности расширения. Используя mod_perl, вы можете непосредственно управлять почти каждым аспектом своего сервера, как если бы работали непосредственно с Perl.

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

 Даже если вы не планируете писать расширения к серверу, вы можете найти данный модуль полезным для себя, так как с его помощью можно значительно ускорить работу Perl-based CGI скриптов.

Установка mod_perl

 Вся установка модуля заключается в инсталлировании пакета libapache2-mod-perl2 package:

lenny:~# apt-get install libapache2-mod-perl2
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
libapache2-reload-perl libbsd-resource-perl libperl5.10
The following NEW packages will be installed
libapache2-mod-perl2 libapache2-reload-perl libbsd-resource-perl libperl5.10
0 upgraded, 4 newly installed, 0 to remove and 2 not upgraded.
Need to get 1201kB of archives.
After this operation, 3891kB of additional disk space will be used.
...
Processing triggers for man-db ...
Setting up libperl5.10 (5.10.0-19) ...
Setting up libapache2-mod-perl2 (2.0.4-5) ...
Enabling module perl.
Run '/etc/init.d/apache2 restart' to activate new configuration!
Setting up libapache2-reload-perl (0.10-2) ...
Setting up libbsd-resource-perl (1.28-1+b1) ...

 Как вы можете видеть, модуль подключается автоматически, но если этого вдруг не произошло, можно сделать это вручную(если вы выполните ручное подключение при отработавшем автоматическом, ничего страшного не случится), после чего необходимо будет перезапустить
Apache:

lenny:~# a2enmod perl
Module perl already enabled
lenny:~# /etc/init.d/apache2 restart
Restarting web server: apache2 ... waiting .

 После установки, модуль не требует дополнительного конфигурирования. Самым простым способом увидеть его работу является выполнение скрипта perl-status. Для этого создайте файл /etc/apache2/conf.d/perl-status следующего содержания:

#
# make status information available at
# http://example.com/perl-status/
#

SetHandler perl-script
PerlHandler +Apache2::Status

#
# But only from the local host, and our trusted
# remote IP.
#

order deny,allow
deny from all
allow from 127.0.0.1
allow from your.ip.address


 После перезагрузки apache2, откройте страницу /perl-status, на которой вы должны увидеть массу интересного — например, переменные окружения сервера и список загруженных perl-модулей.

 Внимание: эта страница может предоставить данные, которые могут быть использованы злоумышленниками, поэтому доступ к ней стоит ограничить.

Ускоряем скрипты Perl CGI

 Поскольку mod_perl представляет собой Perl, встроенный в Apache, то мы можем использовать его для ускорения работы perl-based CGI скриптов. Прибавка в скорости получается из-за отсутствия необходимости запускать интерпретатор Perl при каждом запросе скрипта. Но для получения внушительных результатов, требуется некоторая переделка самого скрипта.

 По умолчанию, скрипты в Debian GNU/Linux находятся в каталоге /usr/lib/cgi-bin и мы можем определить, что Apache управляет ими через mod_perl, произведя следующие изменения в нашей конфигурации:

PerlModule Apache::Registry
Alias /cgi-bin/ /usr/lib/cgi-bin

SetHandler perl-script
PerlHandler Apache::Registry
PerlSendHeader On
Options +ExecCGI


 После перезагрузки сервера (с помощью команды /etc/init.d/apache2 restart) мы уже получим некий радующий нас результат!

Загружаем модули

 Сейчас мы напишем некий код на Perl, который заставим выполняться в рамках процесса Apache. Написанный код необходимо поместить в каталог, откуда он может быть загружен встроенным интерпретатором Perl.

 Обычно, mod_perl в качестве PATH использует те же самые пути, что и Perl, но я считаю, что лучше указать специфический путь.
Пусть это будет /etc/apache2/perl.

 Чтобы указать серверу выполнять определенный скрипт перез стартом, необходимо внести следущие изменения в /etc/apache2/conf/00-mod-perl:

#
# Load the startup script
#
PerlRequire /etc/apache2/perl/startup.pl

 Для задания пути поиска скриптов, содержимое startup.pl будет выглядеть следующим образом:

#
# Add /etc/apache2/perl to the mod_perl search path.
#
use lib qw( /etc/apache2/perl );

#
# This script had no errors (?!)
#
1;

Всякая полезная мелочь

 Одной из проблем, которые я часто наблюдаю, является то, что некоторые пользователи скачивают все статьи, опросы, блоги для offline просмотра
или создания зеркала. Я не против, пока они не начинают потреблять слишком много ресурсов сервера.

 Но есть другой, более горький катаклизм, который выглядит примерно так:

1.2.3.4 - [30/Apr/2009:19:36:29 +0100] "GET /articles/535#comment_2 HTTP/1.0"
1.2.3.4 - [30/Apr/2009:19:36:30 +0100] "GET /articles/535#comment_3 HTTP/1.0"
1.2.3.4 - [30/Apr/2009:19:36:30 +0100] "GET /articles/535#comment_5 HTTP/1.0"
1.2.3.4 - [30/Apr/2009:19:36:31 +0100] "GET /articles/535#comment_4 HTTP/1.0"

 Ясно, что это работа сумасшедшего клиента
(потому что фрагменты «#comment _» никогда не должны появляться в реальных запросах), но такие вещи бывает сложно обнаружить.

 В качестве борьбы с такими клиентами, можно использовать данный нехитрый модуль —
DropClients.pm.

 Этот модуль выполняется для каждого поступающего запроса и выполняет следущие нехитрые действия:

  • Выделяет IP & User-Agent для каждого входящего запроса
  • Если пара IP & Agent нам не нравится, то отклоняем запрос
  • Если пара нравится, но запрос содержит «#», то отклоняем запрос

 Необходимо сохранить файл в каталоге /etc/apache2/perl/ и создать файл /etc/apache2/conf/dropclients следующего содержания:

#
# Load the module
#
PerlModule DropClients

#
# Ensure it is invoked as an access handler
#
<Location />
PerlAccessHandler DropClients
</Location>

 Вот пример хорошего запроса:

skx@gold:~$ echo -e "GET / HTTP/1.0\n" | nc lenny 80 |grep ^HTTP
HTTP/1.1 200 OK

 И плохого запроса:

skx@gold:~$ echo -e "GET /#foo HTTP/1.0\n" | nc lenny 80 |grep ^HTTP
HTTP/1.1 403 Forbidden

 Так как мы обратились с плохим запросом, мы будем заблокированы на сервере:

skx@gold:~$ echo -e "GET / HTTP/1.0\n" | nc lenny 80 |grep ^HTTP
HTTP/1.1 403 Forbidden

 Скрипт, конечно, примитивен, но вы сможете его улучшить. А черный список находится в файле /tmp/blah.

Типы скриптов

 Выше мы рассмотрели тип PerlAccessHandler, выполняющийся при входящем запросе. Также бывают типы PerlResponseHandler — вызывается при ответе на запрос, PerlOutputFilterHandler — вызывает фильтр, модифицирует или обновляет ответ Apache, посылаемый клиенту(например, замена слов, добавление заголовков, или сжатие).

 Полный список типов скриптов, вместе с примерами использования, можно посмотреть тут. Для получения дополнительной информации обратитесь к документации на mod_perl.

Примечание — в данной статье используется понятие Handler, которое я заменил на «скрипт»

Используемая литература:
mod_perl: Cute tricks with Perl & Apache


[ad name=»Google Adsense»]



 Уважайте труд автора, сохраняйте копирайты.
Реклама на сайте висит не просто так и если статья Вам понравилась, с ее помощью Вы можете отблагодарить автора за проделанную работу. Спасибо!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*