Изменения

Платформы для запуска Perl веб-приложений

5577 байтов добавлено, 21:14, 6 августа 2009
Нет описания правки
В статье рассматриваются платформы/библиотеки для запуска веб-приложений на языке [[Perl]]. Рассматриваются они именно как «серверы приложений» — в случае со standalone серверами не предъявляется требований гибкости обычного HTTP-сервера вроде [http://nginx.ru nginx] или [http://httpd.apache.org/ Apache], безопасности, или производительности в обслуживании статических файлов. Задача платформы — предоставить удобный программный интерфейс, такой, чтобы приложение могло получить запрос, предназначающийся ему, и сформировать на него адекватный ответ.
Все они делятся на две категории — библиотеки, дающие возможность запуска Standalone демона, и интерфейсы, требующие для работы внешнего веб HTTP-сервера.
=== FastCGI ===
 
Плюсы:
 
# Возможность запуска старых CGI-приложений в «ускоренном режиме» практически без дополнительных телодвижений. Хороший пример — [[awstats]], представляющий из себя (''внимание!'') '''один''' CGI-скрипт на всё приложение, весом примерно 550 Кб. Один разбор такого скрипта занимает почти полсекунды… А под FastCGI это делается лишь однажды.
# Передача в скрипт любых HTTP-заголовков, какие душе угодны.
# Возможность самостоятельного управления пулом процессов или потоков.
 
Минусы:
 
# Склонность к утечкам памяти, особенно в случае использования большого числа устаревшего кода, рассчитанного на CGI и «умирание» скрипта после обработки каждого запроса.
# Взаимодействие по-прежнему ведётся через функции CGI, поэтому «интерфейсные» минусы CGI никуда не исчезают.
=== mod_perl ===
 
Плюсы:
 
# Очень большая гибкость и возможность комбинирования с другими модулями Apache, в частности, засчёт наличия большого числа обработчиков разных стадий запроса.
 
Минусы:
 
# Чрезмерная завязка на внутреннее устройство веб-сервера [http://httpd.apache.org/ Apache]. Не
# Склонность к утечкам памяти. mod_perl течёт всегда, хоть ты его режь. Решение несложное — MaxRequestsPerChild.
# Серьёзное увеличение размеров потомков Apache.
# Время от времени в mod_perl всплывают совершенно неуловимые глюки, особенно в необычных режимах вроде [http://perldoc.perl.org/perlsec.html taint], и при использовании с некоторыми модулями или движками Apache. ''«Потому что Perl и mod_perl — это как бэ немного разные языки»'' (c). Например:
#* При использовании [http://mpm-itk.sesse.net/ mpm_itk], 2-го мод_перла и PerlOptions +Parent (дающей отдельный пул интерпретаторов виртхосту) глобальные переменные в пакетах (как my, так и our) перестают сохранять свои значения между запросами.
#* При включённом taint mode и тоже в отдельном интерпретаторе, в составе [http://www.bugzilla.org/ Bugzilla] 3.x проявляется следующий мистический баг:
#: На входе строки <code>$oldstr</code> и <code>$newstr</code>, обе не taint’ченные, в <code>$newstr</code> есть запятые, в <code>$oldstr</code> нет. Пишем два идентичных по семантике фрагмента кода:
#:* Если написать <code>$oldstr =~ s/[,\s]+/ /g; $newstr =~ s/[,\s]+/ /g;</code>, то <code>$newstr</code> почему-то становится tainted.
#:* Если же написать <code>s/[,\s]+/ /g for $oldstr, $newstr;</code>, то обе, как и положено, остаются не tainted.
#: Баг воспроизводится только в составе Bugzilla и только под мод_перлом, из контекста выдернуть его не получается.
=== ngx_http_perl_module ===
=== LWP (HTTP::Daemon) ===
 
[http://search.cpan.org/perldoc?LWP LWP] (''libwww-perl'') — библиотека для создания как клиентов, так и серверов, полностью совместимых со спецификацией HTTP/1.1, на чистом Perl’е.
 
Плюсы:
 
# Очень логичный и правильный программный интерфейс — HTTP::Request, HTTP::Response, HTTP::Body и т. п., причём все эти модули используются очень широко и, в отличие от CGI.pm, выверены многими разработчиками.
 
Минусы:
 
# Необходимость реализации алгоритма управления пулом процессов.
=== HTTP::Server::Simple ===