RuEmbeddedPerlModule
Contents |
[edit] ngx_http_perl_module
Модуль ngx_http_perl_module позволяет работать со встроенным в nginx perl'ом: делать обработчики location и переменной и вставлять вызовы perl'а в SSI. По умолчанию модуль не собирается, нужно разрешить его сборку при конфигурировании параметром --with-http_perl_module. Для сборки необходим perl версии 5.6.1 и выше, и компилятор C, совместимый с тем, которым был собран perl. Содержание Известные проблемы Пример конфигурации
[edit] Директивы
- [#perl perl]
- [#perl_modules perl_modules]
- [#perl_require perl_require]
- [#perl_set perl_set]
Вызов perl'а из SSI Методы объекта запроса $r Известные проблемы
Модуль экспериментальный, поэтому возможно всё.
Возможно, основной процесс, а вслед за ним и рабочие процессы, будет увеличиваться в размерах при каждой переконфигурации. Когда основной процесс вырастет до неприемлимых размеров, можно воспользоваться процедурой обновления сервера на лету, не меняя при этом сам исполняемый файл.
Если 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/>");
: $r->rflush;
: if (-f $r->filename or -d _) {
: $r->print($r->uri, " exists!\n");
: }
: return OK;
: }
: 1;
: __END__
[edit] perl
syntax: perl модуль::функция|'sub { ... }'
default: нет
context: location
Директива устанавливает обработчик для данного location.
[edit] perl_modules
syntax: perl_modules путь
default: нет
context: http
Директива задаёт дополнительный путь для perl'овых модулей.
[edit] perl_require
syntax: perl_require модуль
default: нет
context: http
Директива задаёт имя модуля, который будет подгружаться при каждой переконфигурации. Директив может быть несколько.
[edit] perl_set
syntax: perl_set $переменная модуль::функция | 'sub { ... }'
default: нет
context: http
Директива устанавливает обработчик переменной. Вызов perl'а из SSI
Формат команды следующий
Методы объекта запроса $r
- $r->args — метод возвращает аргументы запроса.
- $r->filename — метод возвращает имя файла, соответствующее URI запроса.
- $r->has_request_body(обработчик) — метод возвращает 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(hello::post)) {
: return OK;
: }
: return 400;
: }
: 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->header_in(строка) — метод возвращает значение заданной строки в заголовке запроса клиента.
- $r->header_only — метод определяет, нужно ли передавать клиенту только заголовок ответа или весь ответ.
- $r->header_out(строка, значение) — метод устанавливает значение для заданной строки в заголовке ответа.
- $r->internal_redirect(uri) — метод делает внутренний редирект на указанный uri. Редирект происходит уже после завершения перлового обрабочтика.
- $r->print(текст, ...) — метод передаёт клиенту данные.
- $r->request_body — метод возвращает тело запроса клиента при условии, что тело не записано во временный файл. Для того, чтобы тело запроса клиента гарантировано находилось в памяти, нужно ограничить его размер с помощью client_max_body_size и задать достаточной размер для буфера client_body_buffer_size.
- $r->request_body_file — метод возвращает имя файла, в котором хранится тело запроса клиента. По завершению работы файл необходимо удалить. Для того, чтобы тело запроса клиента всегда записывалось в файл, нужно указать client_body_in_file_only on.
- $r->request_method — метод возвращает HTTP метод запроса клиента.
- $r->remote_addr — метод возвращает IP-адрес клиента.
- $r->rflush — метод немедленно передаёт данные клиенту.
- $r->sendfile(имя [, смещение [, длина ) — метод передаёт клиенту содержимое указанного файла. Необязательные параметры указывают начальное смещение и длину передаваемых данных. Собственно передача данных происходит уже после завершения перлового обрабочтика.
]* $r->send_http_header(тип) — метод передаёт клиенту заголовок ответа. Необязательный параметр "тип" устанавливает значение строки "Content-Type" в заголовке ответа.
- $r->unescape(текст) — метод декодирует текст, заданный в виде %XX.
- $r->uri — метод возвращает URI запроса.









