Spec-Zone.ru › nginx

Модуль ngx_http_perl_module

  • Известные проблемы
  • Пример конфигурации
  • Директивы
  • perl
  • perl_modules
  • perl_require
  • perl_set
  • Вызов Perl из SSI
  • Методы объекта запроса $r

Модуль ngx_http_perl_module используется для реализации обработчиков местоположений и переменных на Perl и вставки вызовов Perl в SSI.

Этот модуль не компилируется по умолчанию, его нужно включить с параметром конфигурации --with-http_perl_module.

Этот модуль требует Perl версии 5.6.1 или выше. Компилятор C должен быть совместим с тем, который использовался для компиляции Perl.

Известные проблемы

Модуль является экспериментальным, используйте с осторожностью.

Для того, чтобы Perl перекомпилировал изменённые модули во время переконфигурации, он должен быть скомпилирован с параметрами -Dusemultiplicity=yes или -Dusethreads=yes. Также, для уменьшения утечки памяти Perl во время выполнения, он должен быть скомпилирован с параметром -Dusemymalloc=no. Чтобы проверить значения этих параметров в уже скомпилированном Perl (предпочтительные значения указаны в примере), выполните:

$ perl -V:usemultiplicity -V:usemymalloc
usemultiplicity='define';
usemymalloc='n';

Обратите внимание, что после перекомпиляции Perl с новыми параметрами -Dusemultiplicity=yes или -Dusethreads=yes, все двоичные модули Perl также необходимо перекомпилировать — они просто перестанут работать с новым Perl.

Существует вероятность, что размер главного процесса и, затем, рабочих процессов будет увеличиваться после каждой переконфигурации. Если размер главного процесса достигнет неприемлемого значения, можно применить процедуру постепенного обновления без изменения исполняемого файла.

Пока модуль Perl выполняет длительную операцию, например, разрешение доменного имени, подключение к другому серверу или запрос к базе данных, другие запросы, назначенные текущему рабочему процессу, не будут обработаны. Поэтому рекомендуется выполнять только такие операции, которые имеют предсказуемое и короткое время выполнения, например, доступ к локальной файловой системе.

Пример конфигурации

http {

    perl_modules perl/lib;
    perl_require hello.pm;

    perl_set $msie6 '

        sub {
            my $r = shift;
            my $ua = $r->header_in("User-Agent");

            return "" if $ua =~ /Opera/;
            return "1" if $ua =~ / MSIE [6-9]\.\d+/;
            return "";
        }

    ';

    server {
        location / {
            perl hello::handler;
        }
    }

Модуль perl/lib/hello.pm:

package hello;

use nginx;

sub handler {
    my $r = shift;

    $r->send_http_header("text/html");
    return OK if $r->header_only;

    $r->print("hello!\n<br/>");

    if (-f $r->filename or -d _) {
        $r->print($r->uri, " exists!\n");
    }

    return OK;
}

1;
__END__

Директивы

Синтаксис: perl module::function|'sub { ... }';
Значение по умолчанию: —
Контекст: location, limit_except

Устанавливает обработчик Perl для данного местоположения.

Синтаксис: perl_modules path;
Значение по умолчанию: —
Контекст: http

Устанавливает дополнительный путь для модулей Perl.

Синтаксис: perl_require module;
Значение по умолчанию: —
Контекст: http

Определяет имя модуля, который будет загружен во время каждой переконфигурации. Можно использовать несколько директив perl_require.

Синтаксис: perl_set $variable module::function|'sub { ... }';
Значение по умолчанию: —
Контекст: http

Устанавливает обработчик Perl для указанной переменной.

Вызов Perl из SSI

Команда SSI, вызывающая Perl, имеет следующий формат:

<!--# perl sub="module::function" arg="parameter1" arg="parameter2" ...
-->

Методы объекта запроса $r

$r->args
возвращает аргументы запроса.
$r->filename
возвращает имя файла, соответствующее запросу URI.
$r->has_request_body(handler)
возвращает 0, если в запросе нет тела. Если тело есть, устанавливает указанный обработчик для запроса и возвращает 1. После чтения тела запроса nginx вызовет указанный обработчик. Обратите внимание, что функция обработчика должна передаваться по ссылке. Пример:
package hello;

use nginx;

sub handler {
    my $r = shift;

    if ($r->request_method ne "POST") {
        return DECLINED;
    }

    if ($r->has_request_body(\&post)) {
        return OK;
    }

    return HTTP_BAD_REQUEST;
}

sub post {
    my $r = shift;

    $r->send_http_header;

    $r->print("request_body: \"", $r->request_body, "\"<br/>");
    $r->print("request_body_file: \"", $r->request_body_file, "\"<br/>\n");

    return OK;
}

1;

__END__
$r->allow_ranges
включает использование диапазонов байтов при отправке ответов.
$r->discard_request_body
указывает nginx на отбрасывание тела запроса.
$r->header_in(field)
возвращает значение указанного поля заголовка клиентского запроса.
$r->header_only
определяет, должен ли весь ответ или только его заголовок отправляться клиенту.
$r->header_out(field, value)
устанавливает значение указанного поля заголовка ответа.
$r->internal_redirect(uri)
выполняет внутренний перенаправление на указанный uri. Фактическое перенаправление происходит после завершения выполнения обработчика Perl.
Начиная с версии 1.17.2, метод принимает закодированные URI и поддерживает перенаправления на именованные местоположения.
$r->log_error(errno, message)
записывает указанный message в error_log. Если errno отлично от нуля, к сообщению будет добавлено код ошибки и его описание.
$r->print(text, ...)
передаёт данные клиенту.
$r->request_body
возвращает тело клиентского запроса, если оно ещё не записано во временный файл. Чтобы убедиться, что тело клиентского запроса находится в памяти, его размер должен быть ограничен client_max_body_size, а достаточный размер буфера должен быть задан с помощью client_body_buffer_size.
$r->request_body_file
возвращает имя файла с телом клиентского запроса. После обработки файл должен быть удалён. Чтобы всегда записывать тело запроса в файл, необходимо включить client_body_in_file_only.
$r->request_method
возвращает HTTP-метод клиентского запроса.
$r->remote_addr
возвращает IP-адрес клиента.
$r->flush
немедленно отправляет данные клиенту.
$r->sendfile(name[, offset[, length]])
отправляет содержимое указанного файла клиенту. Необязательные параметры задают начальный смещение и длину передаваемых данных. Фактическая передача данных происходит после завершения работы обработчика Perl.
$r->send_http_header([type])
отправляет заголовок ответа клиенту. Необязательный параметр type устанавливает значение поля заголовка ответа «Content-Type». Если значение пустая строка, заголовок «Content-Type» не будет отправлен.
$r->status(code)
устанавливает код ответа.
$r->sleep(milliseconds, handler)
устанавливает указанный обработчик и останавливает обработку запроса на указанное время. В это время nginx продолжает обрабатывать другие запросы. По истечении указанного времени nginx вызовет установленный обработчик. Обратите внимание, что функция обработчика должна передаваться по ссылке. Для передачи данных между обработчиками необходимо использовать $r->variable(). Пример:
package hello;

use nginx;

sub handler {
    my $r = shift;

    $r->discard_request_body;
    $r->variable("var", "OK");
    $r->sleep(1000, \&next);

    return OK;
}

sub next {
    my $r = shift;

    $r->send_http_header;
    $r->print($r->variable("var"));

    return OK;
}

1;

__END__
$r->unescape(text)
декодирует текст, закодированный в формате «%XX».
$r->uri
возвращает URI запроса.
$r->variable(name[, value])
возвращает или устанавливает значение указанной переменной. Переменные локальны для каждого запроса.

© 2002-2021 Igor Sysoev
© 2011-2024 Nginx, Inc.
Licensed under the BSD License.
https://nginx.org/en/docs/http/ngx_http_perl_module.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API