Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nginx
GitHub Repository: nginx/nginx.org
Path: blob/main/xml/ru/docs/http/ngx_http_perl_module.xml
1 views
1
<?xml version="1.0"?>
2
3
<!--
4
Copyright (C) Igor Sysoev
5
Copyright (C) Nginx, Inc.
6
-->
7
8
<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd">
9
10
<module name="Модуль ngx_http_perl_module"
11
link="/ru/docs/http/ngx_http_perl_module.html"
12
lang="ru"
13
rev="7">
14
15
<section id="summary">
16
17
<para>
18
Модуль <literal>ngx_http_perl_module</literal> позволяет писать обработчики
19
location и переменных на Perl, а также вставлять вызовы Perl в SSI.
20
</para>
21
22
<para>
23
По умолчанию этот модуль не собирается, его сборку необходимо
24
разрешить с помощью конфигурационного параметра
25
<literal>--with-http_perl_module</literal>.
26
<note>
27
Для сборки этого модуля необходим
28
<link url="https://www.perl.org/get.html">Perl</link> версии 5.6.1 и выше.
29
Компилятор C должен быть совместим с тем, которым был собран Perl.
30
</note>
31
</para>
32
33
</section>
34
35
36
<section id="issues" name="Известные проблемы">
37
38
<para>
39
Модуль экспериментальный, поэтому возможно всё.
40
</para>
41
42
<para>
43
Для того чтобы во время переконфигурации Perl перекомпилировал
44
изменённые модули, его нужно собрать с параметрами
45
<literal>-Dusemultiplicity=yes</literal> или
46
<literal>-Dusethreads=yes</literal>.
47
Кроме того, чтобы во время работы Perl терял меньше памяти,
48
его нужно собрать с параметром
49
<literal>-Dusemymalloc=no</literal>.
50
Узнать значения этих параметров у уже собранного
51
Perl можно так (в примере приведены желаемые значения параметров):
52
<example>
53
$ perl -V:usemultiplicity -V:usemymalloc
54
usemultiplicity='define';
55
usemymalloc='n';
56
</example>
57
</para>
58
59
<para>
60
Необходимо учитывать, что после пересборки Perl с новыми параметрами
61
<literal>-Dusemultiplicity=yes</literal> или
62
<literal>-Dusethreads=yes</literal>
63
придётся также пересобрать и все бинарные модули Perl, так как они
64
просто перестанут работать с новым Perl.
65
</para>
66
67
<para>
68
Возможно, главный процесс, а вслед за ним и рабочие процессы,
69
будут увеличиваться в размерах при каждой переконфигурации.
70
Когда главный процесс вырастет до неприемлемых размеров, можно
71
воспользоваться процедурой
72
<link doc="../control.xml" id="upgrade">обновления сервера на лету</link>,
73
не меняя при этом сам исполняемый файл.
74
</para>
75
76
<para>
77
Если модуль Perl выполняет длительную операцию, например, определяет
78
адрес по имени, соединяется с другим сервером, делает запрос к базе данных,
79
то на это время все остальные запросы, обслуживаемые данным рабочим процессом,
80
не будут обрабатываться. Поэтому рекомендуется ограничиться операциями,
81
время исполнения которых короткое и предсказуемое, например, обращение
82
к локальной файловой системе.
83
</para>
84
85
</section>
86
87
88
<section id="example" name="Пример конфигурации">
89
90
<para>
91
<example>
92
http {
93
94
perl_modules perl/lib;
95
perl_require hello.pm;
96
97
perl_set $msie6 '
98
99
sub {
100
my $r = shift;
101
my $ua = $r->header_in("User-Agent");
102
103
return "" if $ua =~ /Opera/;
104
return "1" if $ua =~ / MSIE [6-9]\.\d+/;
105
return "";
106
}
107
108
';
109
110
server {
111
location / {
112
perl hello::handler;
113
}
114
}
115
</example>
116
</para>
117
118
<para>
119
Модуль <path>perl/lib/hello.pm</path>:
120
<example>
121
package hello;
122
123
use nginx;
124
125
sub handler {
126
my $r = shift;
127
128
$r->send_http_header("text/html");
129
return OK if $r->header_only;
130
131
$r->print("hello!\n&lt;br/&gt;");
132
133
if (-f $r->filename or -d _) {
134
$r->print($r->uri, " exists!\n");
135
}
136
137
return OK;
138
}
139
140
1;
141
__END__
142
</example>
143
</para>
144
145
</section>
146
147
148
<section id="directives" name="Директивы">
149
150
<directive name="perl">
151
<syntax><value>модуль</value>::<value>функция</value>|'sub { ... }'</syntax>
152
<default/>
153
<context>location</context>
154
<context>limit_except</context>
155
156
<para>
157
Устанавливает обработчик Perl для данного location.
158
</para>
159
160
</directive>
161
162
163
<directive name="perl_modules">
164
<syntax><value>путь</value></syntax>
165
<default/>
166
<context>http</context>
167
168
<para>
169
Задаёт дополнительный путь для модулей Perl.
170
</para>
171
172
</directive>
173
174
175
<directive name="perl_require">
176
<syntax><value>модуль</value></syntax>
177
<default/>
178
<context>http</context>
179
180
<para>
181
Задаёт имя модуля, который будет подгружаться при каждой
182
переконфигурации.
183
Директив <literal>perl_require</literal> может быть несколько.
184
</para>
185
186
</directive>
187
188
189
<directive name="perl_set">
190
<syntax>
191
<value>$переменная</value>
192
<value>модуль</value>::<value>функция</value>|'sub { ... }'</syntax>
193
<default/>
194
<context>http</context>
195
196
<para>
197
Устанавливает обработчик Perl для указанной переменной.
198
</para>
199
200
</directive>
201
202
</section>
203
204
205
<section id="ssi" name="Вызов Perl из SSI">
206
207
<para>
208
Формат команды SSI с вызовом Perl следующий:
209
<example>
210
&lt;!--# perl sub="<value>модуль</value>::<value>функция</value>" arg="<value>параметр1</value>" arg="<value>параметр2</value>" ...
211
--&gt;
212
</example>
213
</para>
214
215
</section>
216
217
218
<section id="methods" name="Методы объекта запроса $r">
219
220
<para>
221
<list type="tag">
222
223
<tag-name><literal>$r->args</literal></tag-name>
224
<tag-desc>
225
возвращает аргументы запроса.
226
</tag-desc>
227
228
<tag-name><literal>$r->filename</literal></tag-name>
229
<tag-desc>
230
возвращает имя файла, соответствующее URI запроса.
231
</tag-desc>
232
233
<tag-name>
234
<literal>$r->has_request_body(<value>обработчик</value>)</literal>
235
</tag-name>
236
<tag-desc>
237
возвращает 0, если в запросе нет тела.
238
Если же в запросе есть тело, то устанавливается
239
указанный обработчик и возвращается 1.
240
По окончании чтения тела запроса nginx вызовет установленный обработчик.
241
Обратите внимание, что нужно передавать ссылку на функцию обработчика.
242
Пример:
243
<example>
244
package hello;
245
246
use nginx;
247
248
sub handler {
249
my $r = shift;
250
251
if ($r->request_method ne "POST") {
252
return DECLINED;
253
}
254
255
if ($r->has_request_body(<emphasis>\&amp;post</emphasis>)) {
256
return OK;
257
}
258
259
return HTTP_BAD_REQUEST;
260
}
261
262
sub <emphasis>post</emphasis> {
263
my $r = shift;
264
265
$r->send_http_header;
266
267
$r->print("request_body: \"", $r->request_body, "\"&lt;br/&gt;");
268
$r->print("request_body_file: \"", $r->request_body_file, "\"&lt;br/&gt;\n");
269
270
return OK;
271
}
272
273
1;
274
275
__END__
276
</example>
277
</tag-desc>
278
279
<tag-name><literal>$r->allow_ranges</literal></tag-name>
280
<tag-desc>
281
разрешает использовать диапазоны байт (byte ranges) при передаче ответа.
282
</tag-desc>
283
284
<tag-name><literal>$r->discard_request_body</literal></tag-name>
285
<tag-desc>
286
указывает nginx игнорировать тело запроса.
287
</tag-desc>
288
289
<tag-name><literal>$r->header_in(<value>поле</value>)</literal></tag-name>
290
<tag-desc>
291
возвращает значение заданного поля в заголовке запроса клиента.
292
</tag-desc>
293
294
<tag-name><literal>$r->header_only</literal></tag-name>
295
<tag-desc>
296
определяет, нужно ли передавать клиенту только заголовок ответа или весь ответ.
297
</tag-desc>
298
299
<tag-name>
300
<literal>$r->header_out(<value>поле</value>,
301
<value>значение</value>)</literal>
302
</tag-name>
303
<tag-desc>
304
устанавливает значение для заданного поля в заголовке ответа.
305
</tag-desc>
306
307
<tag-name id="r_internal_redirect">
308
<literal>$r->internal_redirect(<value>uri</value>)</literal>
309
</tag-name>
310
<tag-desc>
311
делает внутреннее перенаправление на указанный <value>uri</value>.
312
Перенаправление происходит уже после завершения обработчика Perl.
313
<note>
314
Начиная с версии 1.17.2 метод принимает экранированные URI и
315
поддерживает перенаправления в именованные location.
316
</note>
317
</tag-desc>
318
319
<tag-name><literal>$r->log_error(<value>код_ошибки</value>,
320
<value>сообщение</value>)</literal></tag-name>
321
<tag-desc>
322
записывает указанное <value>сообщение</value> в
323
<link doc="../ngx_core_module.xml" id="error_log"/>.
324
Если <value>код_ошибки</value> ненулевой, то к сообщению будет добавлен
325
код ошибки и её описание.
326
</tag-desc>
327
328
<tag-name><literal>$r->print(<value>текст</value>, ...)</literal></tag-name>
329
<tag-desc>
330
метод передаёт клиенту данные.
331
</tag-desc>
332
333
<tag-name><literal>$r->request_body</literal></tag-name>
334
<tag-desc>
335
возвращает тело запроса клиента при условии,
336
что тело не записано во временный файл.
337
Для того чтобы тело запроса клиента гарантированно находилось в памяти,
338
нужно ограничить его размер с помощью
339
<link doc="ngx_http_core_module.xml" id="client_max_body_size"/>
340
и задать достаточной размер для буфера
341
<link doc="ngx_http_core_module.xml" id="client_body_buffer_size"/>.
342
</tag-desc>
343
344
<tag-name><literal>$r->request_body_file</literal></tag-name>
345
<tag-desc>
346
возвращает имя файла, в котором хранится тело запроса клиента.
347
По завершению обработки файл необходимо удалить.
348
Для того чтобы тело запроса клиента всегда записывалось в файл,
349
следует включить
350
<link doc="ngx_http_core_module.xml" id="client_body_in_file_only"/>.
351
</tag-desc>
352
353
<tag-name><literal>$r->request_method</literal></tag-name>
354
<tag-desc>
355
возвращает HTTP-метод запроса клиента.
356
</tag-desc>
357
358
<tag-name><literal>$r->remote_addr</literal></tag-name>
359
<tag-desc>
360
возвращает IP-адрес клиента.
361
</tag-desc>
362
363
<tag-name><literal>$r->flush</literal></tag-name>
364
<tag-desc>
365
немедленно передаёт данные клиенту.
366
</tag-desc>
367
368
<tag-name>
369
<literal>$r->sendfile(<value>имя</value>[,
370
<value>смещение</value>[,
371
<value>длина</value>]])</literal>
372
</tag-name>
373
<tag-desc>
374
передаёт клиенту содержимое указанного файла.
375
Необязательные параметры
376
задают начальное смещение и длину передаваемых данных.
377
Непосредственно передача данных происходит уже после завершения
378
обработчика Perl.
379
</tag-desc>
380
381
<tag-name>
382
<literal>$r->send_http_header([<value>тип</value>])</literal>
383
</tag-name>
384
<tag-desc>
385
передаёт клиенту заголовок ответа.
386
Необязательный параметр <value>тип</value> устанавливает значение поля
387
<header>Content-Type</header> в заголовке ответа.
388
Пустая строка в качестве типа запрещает передачу поля
389
<header>Content-Type</header>.
390
</tag-desc>
391
392
<tag-name><literal>$r->status(<value>код</value>)</literal></tag-name>
393
<tag-desc>
394
устанавливает код ответа.
395
</tag-desc>
396
397
<tag-name>
398
<literal>$r->sleep(<value>миллисекунды</value>,
399
<value>обработчик</value>)</literal>
400
</tag-name>
401
<tag-desc>
402
устанавливает указанный обработчик
403
и останавливает обработку запроса на заданное время.
404
nginx в это время продолжает обрабатывать другие запросы.
405
По истечении указанного времени nginx вызовет установленный обработчик.
406
Обратите внимание, что нужно передавать ссылку на функцию обработчика.
407
Для передачи данных между обработчиками следует использовать
408
<literal>$r->variable()</literal>.
409
Пример:
410
<example>
411
package hello;
412
413
use nginx;
414
415
sub handler {
416
my $r = shift;
417
418
$r->discard_request_body;
419
$r->variable("var", "OK");
420
$r->sleep(1000, <emphasis>\&amp;next</emphasis>);
421
422
return OK;
423
}
424
425
sub <emphasis>next</emphasis> {
426
my $r = shift;
427
428
$r->send_http_header;
429
$r->print($r->variable("var"));
430
431
return OK;
432
}
433
434
1;
435
436
__END__
437
</example>
438
</tag-desc>
439
440
<tag-name><literal>$r->unescape(<value>текст</value>)</literal></tag-name>
441
<tag-desc>
442
декодирует текст, заданный в виде “%XX”.
443
</tag-desc>
444
445
<tag-name><literal>$r->uri</literal></tag-name>
446
<tag-desc>
447
возвращает URI запроса.
448
</tag-desc>
449
450
<tag-name>
451
<literal>$r->variable(<value>имя</value>[,
452
<value>значение</value>])</literal>
453
</tag-name>
454
<tag-desc>
455
возвращает или устанавливает значение указанной переменной.
456
Переменные локальны для каждого запроса.
457
</tag-desc>
458
459
</list>
460
</para>
461
462
</section>
463
464
</module>
465
466