# HG changeset patch # User Ruslan Ermilov # Date 1329317077 0 # Node ID c640e00858edc230bea840919a12af38ffed38f3 # Parent 71d99de7ff9779cb7d1c1fefe5eed267b61b2ff2 Revision. diff -r 71d99de7ff97 -r c640e00858ed xml/ru/docs/http/ngx_http_perl_module.xml --- a/xml/ru/docs/http/ngx_http_perl_module.xml Wed Feb 15 14:44:02 2012 +0000 +++ b/xml/ru/docs/http/ngx_http_perl_module.xml Wed Feb 15 14:44:37 2012 +0000 @@ -2,83 +2,86 @@ -
-Модуль ngx_http_perl_module позволяет работать со встроенным в nginx perl'ом: -делать обработчики location и переменной и вставлять вызовы perl'а в SSI. -По умолчанию модуль не собирается, нужно разрешить его сборку -при конфигурировании параметром --with-http_perl_module. -Для сборки необходим perl версии 5.6.1 и выше, и компилятор C, совместимый -с тем, которым был собран perl. +Модуль ngx_http_perl_module позволяет писать обработчики +location и переменных на Perl, а также вставлять вызовы Perl в SSI. + + + +По умолчанию этот модуль не собирается, его сборку необходимо +разрешить с помощью конфигурационного параметра +--with-http_perl_module. + +Для сборки этого модуля необходим Perl версии 5.6.1 и выше. +Компилятор C должен быть совместим с тем, которым был собран Perl. +
-
+
Модуль экспериментальный, поэтому возможно всё. -Для того, чтобы во время переконфигурации perl перекомпилировал -изменённые модули, его нужно собрать с параметрами -Dusemultiplicity=yes -или -Dusethreads=yes. -Кроме того, чтобы во время работы perl меньше терял память, его нужно собрать -с параметром -Dusemymalloc=no. +Для того, чтобы во время переконфигурации Perl перекомпилировал +изменённые модули, его нужно собрать с параметрами +-Dusemultiplicity=yes или +-Dusethreads=yes. +Кроме того, чтобы во время работы Perl меньше терял память, +его нужно собрать с параметром +-Dusemymalloc=no. Узнать значения этих параметров у уже собранного -perl'а можно так (в примерах приведены желаемые значения параметров): +Perl можно так (в примере приведены желаемые значения параметров): -$perl -V:usemultiplicity +$ perl -V:usemultiplicity -V:usemymalloc usemultiplicity='define'; - -$perl -V:usemymalloc usemymalloc='n'; -Необходимо учитывать, что после пересборки perl'а с новыми параметрами --Dusemultiplicity=yes или -Dusethreads=yes -придётся также переустановить и все бинарные perl'овые модули — они -просто перестанут работать с новым perl'ом. +Необходимо учитывать, что после пересборки Perl с новыми параметрами +-Dusemultiplicity=yes или +-Dusethreads=yes +придётся также пересобрать и все бинарные модули Perl — они +просто перестанут работать с новым Perl. Возможно, основной процесс, а вслед за ним и рабочие процессы, -будет увеличиваться в размерах при каждой переконфигурации. +будут увеличиваться в размерах при каждой переконфигурации. Когда основной процесс вырастет до неприемлемых размеров, можно воспользоваться процедурой -обновления сервера на лету, +обновления сервера на лету, не меняя при этом сам исполняемый файл. -Если perl'овый модуль выполняет длительную операцию, например, определяет +Если модуль Perl выполняет длительную операцию, например, определяет адрес по имени, соединяется с другим сервером, делает запрос к базе данных, -то на это время все остальные запросы данного рабочего процесса не будут -обрабатываться. Поэтому рекомендуется ограничиться операциями, +то на это время все остальные запросы, обслуживаемые данным рабочим процессом, +не будут обрабатываться. Поэтому рекомендуется ограничиться операциями, время исполнения которых короткое и предсказуемое, например, обращение к локальной файловой системе. - +Нижеописанные проблемы относятся только к версиям nginx до 0.6.22. - -Нижеописанные проблемы относятся только к версиям nignx'а до 0.6.22. - - - -Данные, возвращаемые методами объекта запроса $r, + +Данные, возвращаемые методами объекта запроса $r, имеют только текстовое значение, причём само значение хранится -в памяти, выделяемой не perl'ом, а nginx'ом из собственных пулов. +в памяти, выделяемой не Perl, а nginx из собственных пулов. Это позволяет уменьшить число операций копирования в большинстве случаев, однако в некоторых ситуациях это приводит к ошибке, например, при попытке использования таких значений в численном контексте @@ -97,50 +100,49 @@ Обход такой ситуации простой — нужно присвоить значение метода переменной, например, такой код -my $i = $r->variable('counter') + 1; +my $i = $r->variable('counter') + 1; нужно заменить на -my $i = $r->variable('counter'); +my $i = $r->variable('counter'); $i++; - + - -Так как строки внутри nginx'а в большинстве случаев хранятся без + +Так как строки внутри nginx в большинстве случаев хранятся без завершающего нуля, то они в таком же виде возвращаются методами -объекта запроса $r (исключения составляют методы $r->filename -и $r->request_body_file). Поэтому такие значения нельзя использовать +объекта запроса $r (исключения составляют методы +$r->filename и $r->request_body_file). +Поэтому такие значения нельзя использовать в качестве имени файла и тому подобном. Обход такой же, как и предыдущей ситуации — присвоение значения переменной (при этом происходит копирование данных и добавление необходимого нуля) или же использование в выражении, например: -open FILE, '/path/' . $r->variable('name'); +open FILE, '/path/' . $r->variable('name'); + - - -
-
+
http { - perl_modules perl/lib; - perl_require hello.pm; + perl_modules perl/lib; + perl_require hello.pm; - perl_set $msie6 ' + perl_set $msie6 ' sub { my $r = shift; - my $ua = $r->header_in("User-Agent"); + my $ua = $r->header_in("User-Agent"); return "" if $ua =~ /Opera/; return "1" if $ua =~ / MSIE [6-9]\.\d+/; @@ -151,14 +153,14 @@ server { location / { - perl hello::handler; + perl hello::handler; } } -модуль perl/lib/hello.pm: +Модуль perl/lib/hello.pm: package hello; @@ -167,13 +169,13 @@ sub handler { my $r = shift; - $r->send_http_header("text/html"); - return OK if $r->header_only; + $r->send_http_header("text/html"); + return OK if $r->header_only; - $r->print("hello!\n<br/>"); + $r->print("hello!\n<br/>"); - if (-f $r->filename or -d _) { - $r->print($r->uri, " exists!\n"); + if (-f $r->filename or -d _) { + $r->print($r->uri, " exists!\n"); } return OK; @@ -181,22 +183,22 @@ 1; __END__ -
-
+
-модуль::функция|'sub { ... }' +модуль::функция|'sub { ... }' -location, limit_except +location +limit_except -Директива устанавливает обработчик для данного location. +Устанавливает обработчик Perl для данного location. @@ -208,7 +210,7 @@ http -Директива задаёт дополнительный путь для perl'овых модулей. +Задаёт дополнительный путь для модулей Perl. @@ -220,22 +222,23 @@ http -Директива задаёт имя модуля, который будет подгружаться при каждой -переконфигурации. Директив может быть несколько. +Задаёт имя модуля, который будет подгружаться при каждой +переконфигурации. +Директив perl_require может быть несколько. -$переменная - модуль::функция|'sub { ... }' - + + $переменная + модуль::функция|'sub { ... }' http -Директива устанавливает обработчик переменной. +Устанавливает обработчик Perl для указанной переменной. @@ -243,12 +246,12 @@
-
+
-Формат команды следующий: +Формат команды SSI с вызовом Perl следующий: -<!--# perl sub="модуль::функция" arg="параметр1" arg="параметр2" ... +<!--# perl sub="модуль::функция" arg="параметр1" arg="параметр2" ... --> @@ -256,27 +259,31 @@
-
+
- + - -$r->args — метод возвращает аргументы запроса. - +$r->args + +возвращает аргументы запроса. + - -$r->filename — метод возвращает имя файла, -соответствующее URI запроса. - +$r->filename + +возвращает имя файла, соответствующее URI запроса. + - -$r->has_request_body(обработчик) — метод возвращает 0, -если в запросе нет тела. Если же тело запроса есть, то устанавливается + + $r->has_request_body(обработчик) + + +возвращает 0, если в запросе нет тела. +Если же тело запроса есть, то устанавливается указанный обработчик и возвращается 1. -По окончании приёма тела nginx вызовет установленный обработчик. +По окончании чтения тела запроса nginx вызовет установленный обработчик. Обратите внимание, что нужно передавать ссылку на функцию обработчика. -Пример использования: +Пример: package hello; @@ -285,11 +292,11 @@ sub handler { my $r = shift; - if ($r->request_method ne "POST") { + if ($r->request_method ne "POST") { return DECLINED; } - if ($r->has_request_body(\&post)) { + if ($r->has_request_body(\&post)) { return OK; } @@ -299,10 +306,10 @@ sub post { my $r = shift; - $r->send_http_header; + $r->send_http_header; - $r->print("request_body: \"", $r->request_body, "\"<br/>"); - $r->print("request_body_file: \"", $r->request_body_file, "\"<br/>\n"); + $r->print("request_body: \"", $r->request_body, "\"<br/>"); + $r->print("request_body_file: \"", $r->request_body_file, "\"<br/>\n"); return OK; } @@ -311,110 +318,134 @@ __END__ - + - -$r->allow_ranges — метод разрешает использовать -byte ranges при передаче ответа. - +$r->allow_ranges + +разрешает использовать диапазоны байт (byte ranges) при передаче ответа. + - -$r->discard_request_body — метод указывает nginx'у -игнорировать тело запроса. - +$r->discard_request_body + +указывает nginx игнорировать тело запроса. + - -$r->header_in(строка) — метод возвращает значение -заданной строки в заголовке запроса клиента. - +$r->header_in(поле) + +возвращает значение заданного поля в заголовке запроса клиента. + + +$r->header_only + +определяет, нужно ли передавать клиенту только заголовок ответа или весь ответ. + - -$r->header_only — метод определяет, нужно ли передавать -клиенту только заголовок ответа или весь ответ. - - - -$r->header_out(строка, значение) — метод устанавливает -значение для заданной строки в заголовке ответа. - + + $r->header_out(поле, + значение) + + +устанавливает значение для заданного поля в заголовке ответа. + - -$r->internal_redirect(uri) — метод делает внутреннее -перенаправление на указанный uri. -Перенаправление происходит уже после завершения perl'ового обработчика. - + + $r->internal_redirect(uri) + + +делает внутреннее перенаправление на указанный uri. +Перенаправление происходит уже после завершения обработчика Perl. + - -$r->print(текст, ...) — метод передаёт клиенту данные. - +$r->print(текст, ...) + +метод передаёт клиенту данные. + - -$r->request_body — метод возвращает тело запроса -клиента при условии, что тело не записано во временный файл. -Для того, чтобы тело запроса клиента гарантировано находилось в памяти, +$r->request_body + +возвращает тело запроса клиента при условии, +что тело не записано во временный файл. +Для того, чтобы тело запроса клиента гарантированно находилось в памяти, нужно ограничить его размер с помощью и задать достаточной размер для буфера . - + - -$r->request_body_file — метод возвращает имя файла, -в котором хранится тело запроса клиента. -По завершению работы файл необходимо удалить. -Для того, чтобы тело запроса клиента всегда записывалось в файл, нужно -указать client_body_in_file_only on. - +$r->request_body_file + +возвращает имя файла, в котором хранится тело запроса клиента. +По завершению обработки файл необходимо удалить. +Для того, чтобы тело запроса клиента всегда записывалось в файл, +следует включить +. + - -$r->request_method — метод возвращает HTTP метод -запроса клиента. - +$r->request_method + +возвращает HTTP-метод запроса клиента. + - -$r->remote_addr — метод возвращает IP-адрес клиента. - +$r->remote_addr + +возвращает IP-адрес клиента. + - -$r->flush — метод немедленно передаёт данные клиенту. - +$r->flush + +немедленно передаёт данные клиенту. + - -$r->sendfile(имя [, смещение [, длина]]) — метод -передаёт клиенту содержимое указанного файла. Необязательные параметры -указывают начальное смещение и длину передаваемых данных. -Собственно передача данных происходит уже после завершения -perl'ового обработчика. + + $r->sendfile(имя[, + смещение[, + длина]]) + + +передаёт клиенту содержимое указанного файла. +Необязательные параметры +задают начальное смещение и длину передаваемых данных. +Непосредственно передача данных происходит уже после завершения +обработчика Perl. Необходимо учитывать, что при использовании -этого метода в подзапросе и директиве -sendfile on +этого метода в подзапросе и включённой директиве + содержимое файла не будет проходить через gzip, SSI и charset фильтры. - + - -$r->send_http_header(тип) — метод + + $r->send_http_header([тип]) + + передаёт клиенту заголовок ответа. -Необязательный параметр "тип" устанавливает значение строки "Content-Type" -в заголовке ответа. -Пустая строка в качестве типа запрещает строку "Content-Type". - +Необязательный параметр тип устанавливает значение поля +
Content-Type
в заголовке ответа. +Пустая строка в качестве типа запрещает передачу поля +
Content-Type
. + - -$r->status(код) — метод устанавливает код ответа. - +$r->status(код) + +устанавливает код ответа. + - -$r->sleep(миллисекунды, обработчик) — метод устанавливает -указанный обработчик и останавливает обработку запроса на заданное время. + + $r->sleep(миллисекунды, + обработчик) + + +устанавливает указанный обработчик +и останавливает обработку запроса на заданное время. nginx в это время продолжает обрабатывать другие запросы. По истечении указанного времени nginx вызовет установленный обработчик. Обратите внимание, что нужно передавать ссылку на функцию обработчика. -Для передачи данных между обработчиками следует использовать $r->variable(). -Пример использования: +Для передачи данных между обработчиками следует использовать +$r->variable(). +Пример: package hello; @@ -423,9 +454,9 @@ sub handler { my $r = shift; - $r->discard_request_body; - $r->variable("var", "OK"); - $r->sleep(1000, \&next); + $r->discard_request_body; + $r->variable("var", "OK"); + $r->sleep(1000, \&next); return OK; } @@ -433,8 +464,8 @@ sub next { my $r = shift; - $r->send_http_header; - $r->print($r->variable("var")); + $r->send_http_header; + $r->print($r->variable("var")); return OK; } @@ -443,22 +474,26 @@ __END__ - + - -$r->unescape(текст) — метод декодирует текст, -заданный в виде %XX. - +$r->unescape(текст) + +декодирует текст, заданный в виде “%XX”. + - -$r->uri — метод возвращает URI запроса. - +$r->uri + +возвращает URI запроса. + - -$r->variable(имя [, значение]) — метод возвращает -или устанавливает значение указанной переменной. + + $r->variable(имя[, + значение]) + + +возвращает или устанавливает значение указанной переменной. Переменные локальны для каждого запроса. - +