Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nginx
GitHub Repository: nginx/nginx.org
Path: blob/main/xml/ru/docs/http/ngx_http_js_module.xml
1 views
1
<?xml version="1.0"?>
2
3
<!--
4
Copyright (C) Nginx, Inc.
5
-->
6
7
<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd">
8
9
<module name="Модуль ngx_http_js_module"
10
link="/ru/docs/http/ngx_http_js_module.html"
11
lang="ru"
12
rev="59">
13
14
<section id="summary">
15
16
<para>
17
Модуль <literal>ngx_http_js_module</literal> позволяет задавать
18
обработчики location и переменных
19
на <link doc="../njs/index.xml">njs</link> 
20
подмножестве языка JavaScript.
21
</para>
22
23
<para>
24
Инструкция по сборке и установке доступны
25
<link doc="../njs/install.xml">здесь</link>.
26
</para>
27
28
</section>
29
30
31
<section id="example" name="Пример конфигурации">
32
33
<para>
34
Пример работает начиная с версии
35
<link doc="../njs/changes.xml" id="njs0.4.0">0.4.0</link>.
36
<example>
37
http {
38
# начиная с 0.9.1
39
js_engine qjs;
40
41
js_import http.js;
42
43
js_set $foo http.foo;
44
js_set $summary http.summary;
45
js_set $hash http.hash;
46
47
resolver 10.0.0.1;
48
49
server {
50
listen 8000;
51
52
location / {
53
add_header X-Foo $foo;
54
js_content http.baz;
55
}
56
57
location = /summary {
58
return 200 $summary;
59
}
60
61
location = /hello {
62
js_content http.hello;
63
}
64
65
# начиная с версии 0.7.0
66
location = /fetch {
67
js_content http.fetch;
68
js_fetch_trusted_certificate /path/to/ISRG_Root_X1.pem;
69
}
70
71
# начиная с версии 0.7.0
72
location = /crypto {
73
add_header Hash $hash;
74
return 200;
75
}
76
}
77
}
78
</example>
79
</para>
80
81
<para>
82
Файл <path>http.js</path>:
83
<example>
84
function foo(r) {
85
r.log("hello from foo() handler");
86
return "foo";
87
}
88
89
function summary(r) {
90
var a, s, h;
91
92
s = "JS summary\n\n";
93
94
s += "Method: " + r.method + "\n";
95
s += "HTTP version: " + r.httpVersion + "\n";
96
s += "Host: " + r.headersIn.host + "\n";
97
s += "Remote Address: " + r.remoteAddress + "\n";
98
s += "URI: " + r.uri + "\n";
99
100
s += "Headers:\n";
101
for (h in r.headersIn) {
102
s += " header '" + h + "' is '" + r.headersIn[h] + "'\n";
103
}
104
105
s += "Args:\n";
106
for (a in r.args) {
107
s += " arg '" + a + "' is '" + r.args[a] + "'\n";
108
}
109
110
return s;
111
}
112
113
function baz(r) {
114
r.status = 200;
115
r.headersOut.foo = 1234;
116
r.headersOut['Content-Type'] = "text/plain; charset=utf-8";
117
r.headersOut['Content-Length'] = 15;
118
r.sendHeader();
119
r.send("nginx");
120
r.send("java");
121
r.send("script");
122
123
r.finish();
124
}
125
126
function hello(r) {
127
r.return(200, "Hello world!");
128
}
129
130
// начиная с версии 0.7.0
131
async function fetch(r) {
132
let results = await Promise.all([ngx.fetch('https://nginx.org/'),
133
ngx.fetch('https://nginx.org/en/')]);
134
135
r.return(200, JSON.stringify(results, undefined, 4));
136
}
137
138
// начиная с версии 0.7.0
139
async function hash(r) {
140
let hash = await crypto.subtle.digest('SHA-512', r.headersIn.host);
141
r.setReturnValue(Buffer.from(hash).toString('hex'));
142
}
143
144
export default {foo, summary, baz, hello, fetch, hash};
145
</example>
146
</para>
147
148
</section>
149
150
151
<section id="directives" name="Директивы">
152
153
<directive name="js_body_filter">
154
<syntax><value>модуль.функция</value>
155
[<value>buffer_type</value>=<value>string</value> | <value>buffer</value>]</syntax>
156
<default/>
157
<context>location</context>
158
<context>if in location</context>
159
<context>limit_except</context>
160
<appeared-in>0.5.2</appeared-in>
161
162
<para>
163
Задаёт функцию njs в качестве фильтра тела ответа.
164
Функция фильтра вызывается для каждого блока данных тела ответа
165
со следующими аргументами:
166
167
<list type="tag">
168
<tag-name><literal>r</literal></tag-name>
169
<tag-desc>
170
объект <link doc="../njs/reference.xml" id="http">HTTP request</link>
171
</tag-desc>
172
173
<tag-name><literal>data</literal></tag-name>
174
<tag-desc>
175
входящий блок данных
176
может быть строкой или буфером
177
в зависимости от значения <literal>buffer_type</literal>,
178
по умолчанию является строкой.
179
Начиная с <link doc="../njs/changes.xml" id="njs0.8.5">0.8.5</link>,
180
по умолчанию
181
значение <literal>data</literal> неявно преобразуется в валидную строку UTF-8.
182
Для бинарных данных параметр <literal>buffer_type</literal>
183
необходимо установить в <literal>buffer</literal>.
184
</tag-desc>
185
186
<tag-name><literal>flags</literal></tag-name>
187
<tag-desc>
188
объект со следующими свойствами:
189
<list type="tag">
190
<tag-name><literal>last</literal></tag-name>
191
<tag-desc>
192
логическое значение, true, если данные являются последним буфером.
193
</tag-desc>
194
195
</list>
196
</tag-desc>
197
198
</list>
199
</para>
200
201
<para>
202
Функция фильтра может передавать свою модифицированную версию
203
входящего блока данных следующему фильтру тела ответа при помощи вызова
204
<link doc="../njs/reference.xml" id="r_sendbuffer"><literal>r.sendBuffer()</literal></link>.
205
Пример преобразования букв в нижний регистр в теле ответа:
206
<example>
207
function filter(r, data, flags) {
208
r.sendBuffer(data.toLowerCase(), flags);
209
}
210
</example>
211
Для отмены фильтра (блоки данных будут передаваться клиенту
212
без вызова <literal>js_body_filter</literal>),
213
можно использовать
214
<link doc="../njs/reference.xml" id="r_done"><literal>r.done()</literal></link>.
215
</para>
216
217
<para>
218
Если функция фильтра изменяет длину тела ответа, то
219
необходимо очистить заголовок ответа <header>Content-Length</header>
220
(если присутствует) в
221
<link id="js_header_filter"><literal>js_header_filter</literal></link>,
222
чтобы применить поблочное кодирование.
223
</para>
224
225
<para>
226
<note>
227
Так как обработчик <literal>js_body_filter</literal>
228
должен сразу возвращать результат,
229
то поддерживаются только синхронные операции,
230
Таким образом, асинхронные операции, например
231
<link doc="../njs/reference.xml" id="r_subrequest">r.subrequest()</link>
232
или
233
<link doc="../njs/reference.xml" id="settimeout">setTimeout()</link>,
234
не поддерживаются.
235
</note>
236
</para>
237
238
<para>
239
<note>
240
Директива может быть указана внутри
241
блока <link doc="../http/ngx_http_rewrite_module.xml" id="if">if</link>
242
начиная с <link doc="../njs/changes.xml" id="njs0.7.7">0.7.7</link>.
243
</note>
244
</para>
245
246
</directive>
247
248
249
<directive name="js_access">
250
<syntax><value>модуль.функция</value></syntax>
251
<default/>
252
<context>location</context>
253
<context>if in location</context>
254
<context>limit_except</context>
255
<appeared-in>0.9.9</appeared-in>
256
257
<para>
258
Задаёт функцию njs в качестве обработчика
259
<link doc="../dev/development_guide.xml" id="http_phases">фазы доступа</link>.
260
Поддерживаются асинхронные операции, такие как
261
<link doc="../njs/reference.xml" id="r_subrequest">r.subrequest()</link>,
262
<link doc="../njs/reference.xml" id="ngx_fetch">ngx.fetch()</link>
263
и <link doc="../njs/reference.xml" id="settimeout">setTimeout()</link>.
264
</para>
265
266
<para>
267
Обработчик, завершившийся без вызова
268
<link doc="../njs/reference.xml" id="r_return"><literal>r.return()</literal></link>
269
или
270
<link doc="../njs/reference.xml" id="r_decline"><literal>r.decline()</literal></link>,
271
разрешает доступ.
272
Чтобы запретить доступ или отправить произвольный ответ
273
(например, перенаправление), обработчик может вызвать
274
<link doc="../njs/reference.xml" id="r_return"><literal>r.return()</literal></link>.
275
Чтобы обработчик не выражал мнения о доступе, передавая решение другим
276
проверкам доступа при использовании
277
<link doc="ngx_http_core_module.xml" id="satisfy"><literal>satisfy any</literal></link>,
278
обработчик может вызвать
279
<link doc="../njs/reference.xml" id="r_decline"><literal>r.decline()</literal></link>.
280
</para>
281
282
<para>
283
Например:
284
<example>
285
example.conf:
286
location /protected/ {
287
js_access main.auth;
288
proxy_pass http://upstream;
289
}
290
291
example.js:
292
async function auth(r) {
293
let reply = await ngx.fetch('http://authsvc/check', {
294
headers: {Authorization: r.headersIn.Authorization}
295
});
296
297
if (reply.status != 200) {
298
r.return(401);
299
return;
300
}
301
}
302
303
export default {auth};
304
</example>
305
</para>
306
307
</directive>
308
309
310
<directive name="js_content">
311
<syntax><value>модуль.функция</value></syntax>
312
<default/>
313
<context>location</context>
314
<context>if in location</context>
315
<context>limit_except</context>
316
317
<para>
318
Задаёт функцию njs в качестве обработчика содержимого location.
319
Начиная с версии <link doc="../njs/changes.xml" id="njs0.4.0">0.4.0</link>
320
можно ссылаться на функцию модуля.
321
</para>
322
323
<para>
324
<note>
325
Директива может быть указана внутри
326
блока <link doc="../http/ngx_http_rewrite_module.xml" id="if">if</link>
327
начиная с <link doc="../njs/changes.xml" id="njs0.7.7">0.7.7</link>.
328
</note>
329
</para>
330
331
</directive>
332
333
334
<directive name="js_context_reuse">
335
<syntax><value>число</value></syntax>
336
<default>128</default>
337
<context>http</context>
338
<context>server</context>
339
<context>location</context>
340
<appeared-in>0.8.6</appeared-in>
341
342
<para>
343
Задаёт максимальное число контекстов JS для повторного использования
344
<link doc="../njs/engine.xml">движке QuickJS</link>.
345
Каждый контекст используется для одного запроса.
346
Завершённый контекст помещается в пул повторно используемых контекстов.
347
Если пул заполнен, контекст уничтожается.
348
</para>
349
350
</directive>
351
352
353
<directive name="js_engine">
354
<syntax><literal>njs</literal> | <literal>qjs</literal></syntax>
355
<default>njs</default>
356
<context>http</context>
357
<context>server</context>
358
<context>location</context>
359
<appeared-in>0.8.6</appeared-in>
360
361
<para>
362
Задаёт <link doc="../njs/engine.xml">движок JavaScript</link>
363
для использования в сценариях njs.
364
Параметр <literal>njs</literal> задаёт использование движка njs,
365
также используемого по умолчанию.
366
Параметр <literal>qjs</literal> задаёт использование движка QuickJS.
367
</para>
368
369
<para>
370
<note>
371
Движок <literal>njs</literal> объявлен устаревшим
372
начиная с <link doc="../njs/changes.xml" id="njs1.0.0">1.0.0</link>;
373
в новых конфигурациях следует использовать <literal>qjs</literal>
374
(<link doc="../njs/engine.xml" id="quickjs_engine">QuickJS</link>).
375
</note>
376
</para>
377
378
</directive>
379
380
381
<directive name="js_fetch_buffer_size">
382
<syntax><value>размер</value></syntax>
383
<default>16k</default>
384
<context>http</context>
385
<context>server</context>
386
<context>location</context>
387
<appeared-in>0.7.4</appeared-in>
388
389
<para>
390
Задаёт <value>размер</value> буфера, который будет использоваться
391
для чтения и записи для
392
<link doc="../njs/reference.xml" id="ngx_fetch">Fetch API</link>.
393
</para>
394
395
</directive>
396
397
398
<directive name="js_fetch_ciphers">
399
<syntax><value>шифры</value></syntax>
400
<default>HIGH:!aNULL:!MD5</default>
401
<context>http</context>
402
<context>server</context>
403
<context>location</context>
404
<appeared-in>0.7.0</appeared-in>
405
406
<para>
407
Описывает разрешённые шифры для HTTPS-запросов
408
при помощи <link doc="../njs/reference.xml" id="ngx_fetch">Fetch API</link>.
409
Шифры задаются в формате, поддерживаемом библиотекой OpenSSL.
410
</para>
411
412
<para>
413
Полный список можно посмотреть с помощью команды
414
<command>openssl ciphers</command>”.
415
</para>
416
417
</directive>
418
419
420
<directive name="js_fetch_max_response_buffer_size">
421
<syntax><value>размер</value></syntax>
422
<default>1m</default>
423
<context>http</context>
424
<context>server</context>
425
<context>location</context>
426
<appeared-in>0.7.4</appeared-in>
427
428
<para>
429
Задаёт максимальный <value>размер</value> ответа, полученного
430
при помощи <link doc="../njs/reference.xml" id="ngx_fetch">Fetch API</link>.
431
</para>
432
433
</directive>
434
435
436
<directive name="js_fetch_protocols">
437
<syntax>
438
[<literal>TLSv1</literal>]
439
[<literal>TLSv1.1</literal>]
440
[<literal>TLSv1.2</literal>]
441
[<literal>TLSv1.3</literal>]</syntax>
442
<default>TLSv1 TLSv1.1 TLSv1.2</default>
443
<context>http</context>
444
<context>server</context>
445
<context>location</context>
446
<appeared-in>0.7.0</appeared-in>
447
448
<para>
449
Разрешает указанные протоколы для HTTPS-запросов
450
при помощи <link doc="../njs/reference.xml" id="ngx_fetch">Fetch API</link>.
451
</para>
452
453
</directive>
454
455
456
<directive name="js_fetch_timeout">
457
<syntax><value>время</value></syntax>
458
<default>60s</default>
459
<context>http</context>
460
<context>server</context>
461
<context>location</context>
462
<appeared-in>0.7.4</appeared-in>
463
464
<para>
465
Задаёт таймаут при чтении и записи
466
при помощи <link doc="../njs/reference.xml" id="ngx_fetch">Fetch API</link>.
467
Таймаут устанавливается не на всю передачу ответа,
468
а только между двумя операциями чтения.
469
Если по истечении этого времени данные не передавались, соединение закрывается.
470
</para>
471
472
</directive>
473
474
475
<directive name="js_fetch_trusted_certificate">
476
<syntax><value>файл</value></syntax>
477
<default/>
478
<context>http</context>
479
<context>server</context>
480
<context>location</context>
481
<appeared-in>0.7.0</appeared-in>
482
483
<para>
484
Задаёт <value>файл</value> с доверенными сертификатами CA в формате PEM,
485
используемыми при
486
<link doc="../njs/reference.xml" id="fetch_verify">проверке</link>
487
HTTPS-сертификата
488
при помощи <link doc="../njs/reference.xml" id="ngx_fetch">Fetch API</link>.
489
</para>
490
491
</directive>
492
493
494
<directive name="js_fetch_verify">
495
<syntax><literal>on</literal> | <literal>off</literal></syntax>
496
<default>on</default>
497
<context>http</context>
498
<context>server</context>
499
<context>location</context>
500
<appeared-in>0.7.4</appeared-in>
501
502
<para>
503
Разрешает или запрещает проверку сертификата HTTPS-сервера
504
при помощи <link doc="../njs/reference.xml" id="ngx_fetch">Fetch API</link>.
505
</para>
506
507
</directive>
508
509
510
<directive name="js_fetch_verify_depth">
511
<syntax><value>число</value></syntax>
512
<default>100</default>
513
<context>http</context>
514
<context>server</context>
515
<context>location</context>
516
<appeared-in>0.7.0</appeared-in>
517
518
<para>
519
Устанавливает глубину проверки в цепочке HTTPS-сертификатов
520
при помощи <link doc="../njs/reference.xml" id="ngx_fetch">Fetch API</link>.
521
</para>
522
523
</directive>
524
525
526
<directive name="js_fetch_proxy">
527
<syntax><value>url</value></syntax>
528
<default/>
529
<context>http</context>
530
<context>server</context>
531
<context>location</context>
532
<appeared-in>0.9.4</appeared-in>
533
534
<para>
535
Задаёт URL прямого прокси-сервера
536
при помощи <link doc="../njs/reference.xml" id="ngx_fetch">Fetch API</link>.
537
<value>url</value> поддерживает только схему HTTP
538
и может содержать необязательные учётные данные пользователя
539
в формате <literal>http://[user:password@]host:port</literal>
540
для базовой аутентификации.
541
Поддерживает как HTTP, так и HTTPS соединения с серверами назначения.
542
Если <value>url</value> пустой, маршрутизация через прокси отключается.
543
Значение параметра может содержать переменные.
544
</para>
545
546
<para>
547
Пример:
548
<example>
549
location /fetch {
550
js_fetch_proxy http://user:[email protected]:3128;
551
js_content main.fetch_handler;
552
}
553
</example>
554
</para>
555
556
</directive>
557
558
559
<directive name="js_fetch_keepalive">
560
<syntax><value>соединения</value></syntax>
561
<default>0</default>
562
<context>http</context>
563
<context>server</context>
564
<context>location</context>
565
<appeared-in>0.9.2</appeared-in>
566
567
<para>
568
Активирует кэш для соединений с серверами назначения.
569
Если значение больше <literal>0</literal>,
570
включает keepalive-соединения для
571
<link doc="../njs/reference.xml" id="ngx_fetch">Fetch API</link>.
572
</para>
573
574
<para>
575
Параметр <value>соединения</value> задаёт максимальное количество
576
неактивных keepalive-соединений с серверами назначения,
577
которые сохраняются в кэше каждого рабочего процесса.
578
Если это количество превышено, наименее недавно использованные соединения закрываются.
579
</para>
580
581
<para>
582
В HTTP кэш ведётся отдельно для каждой итоговой конфигурации location.
583
Значение, заданное на уровне <literal>http</literal> или
584
<literal>server</literal>, наследуется location, но каждый location
585
использует свой кэш.
586
Закэшированные соединения повторно используются для запросов с тем же
587
протоколом, именем узла и портом.
588
</para>
589
590
<para>
591
При включении keepalive предполагается, что серверы назначения отправляют
592
корректные HTTP-ответы.
593
</para>
594
595
<para>
596
Пример:
597
<example>
598
location /fetch {
599
js_fetch_keepalive 32;
600
js_fetch_trusted_certificate /path/to/ISRG_Root_X1.pem;
601
js_content main.fetch_handler;
602
}
603
</example>
604
</para>
605
606
</directive>
607
608
609
<directive name="js_fetch_keepalive_requests">
610
<syntax><value>число</value></syntax>
611
<default>1000</default>
612
<context>http</context>
613
<context>server</context>
614
<context>location</context>
615
<appeared-in>0.9.2</appeared-in>
616
617
<para>
618
Задаёт максимальное количество запросов, которые могут быть обслужены
619
через одно keepalive-соединение при помощи
620
<link doc="../njs/reference.xml" id="ngx_fetch">Fetch API</link>.
621
После выполнения максимального количества запросов соединение закрывается.
622
</para>
623
624
<para>
625
Периодическое закрытие соединений необходимо для освобождения
626
выделенной под соединение памяти.
627
Поэтому использование слишком большого максимального количества запросов
628
может привести к чрезмерному потреблению памяти и не рекомендуется.
629
</para>
630
631
</directive>
632
633
634
<directive name="js_fetch_keepalive_time">
635
<syntax><value>время</value></syntax>
636
<default>1h</default>
637
<context>http</context>
638
<context>server</context>
639
<context>location</context>
640
<appeared-in>0.9.2</appeared-in>
641
642
<para>
643
Ограничивает максимальное время, в течение которого запросы могут обрабатываться
644
через одно keepalive-соединение при помощи
645
<link doc="../njs/reference.xml" id="ngx_fetch">Fetch API</link>.
646
По истечении этого времени соединение закрывается после обработки очередного запроса.
647
</para>
648
649
</directive>
650
651
652
<directive name="js_fetch_keepalive_timeout">
653
<syntax><value>время</value></syntax>
654
<default>60s</default>
655
<context>http</context>
656
<context>server</context>
657
<context>location</context>
658
<appeared-in>0.9.2</appeared-in>
659
660
<para>
661
Задаёт таймаут, в течение которого неактивное keepalive-соединение
662
с сервером назначения остается открытым при помощи
663
<link doc="../njs/reference.xml" id="ngx_fetch">Fetch API</link>.
664
</para>
665
666
</directive>
667
668
669
<directive name="js_header_filter">
670
<syntax><value>модуль.функция</value></syntax>
671
<default/>
672
<context>location</context>
673
<context>if in location</context>
674
<context>limit_except</context>
675
<appeared-in>0.5.1</appeared-in>
676
677
<para>
678
Задаёт функцию njs в качестве фильтра заголовка ответа.
679
Директива позволяет менять произвольные поля заголовка ответа.
680
</para>
681
682
<para>
683
<note>
684
Так как обработчик <literal>js_header_filter</literal>
685
должен сразу возвращать результат,
686
то поддерживаются только синхронные операции,
687
Таким образом, асинхронные операции, например
688
<link doc="../njs/reference.xml" id="r_subrequest">r.subrequest()</link>
689
или
690
<link doc="../njs/reference.xml" id="settimeout">setTimeout()</link>,
691
не поддерживаются.
692
</note>
693
</para>
694
695
<para>
696
<note>
697
Директива может быть указана внутри
698
блока <link doc="../http/ngx_http_rewrite_module.xml" id="if">if</link>
699
начиная с <link doc="../njs/changes.xml" id="njs0.7.7">0.7.7</link>.
700
</note>
701
</para>
702
703
</directive>
704
705
706
<directive name="js_import">
707
<syntax><value>модуль.js</value> |
708
<value>имя_экспорта from модуль.js</value></syntax>
709
<default/>
710
<context>http</context>
711
<context>server</context>
712
<context>location</context>
713
<appeared-in>0.4.0</appeared-in>
714
715
<para>
716
Импортирует модуль, позволяющий задавать обработчики location и переменных
717
на njs.
718
<literal>Имя_экспорта</literal> является пространством имён
719
при доступе к функциям модуля.
720
Если <literal>имя_экспорта</literal> не задано,
721
то пространством имён будет являться имя модуля.
722
<example>
723
js_import http.js;
724
</example>
725
В примере при доступе к экспорту в качестве
726
пространства имён используется имя модуля <literal>http</literal>.
727
Если импортируемый модуль экспортирует <literal>foo()</literal>,
728
то для доступа используется <literal>http.foo</literal>.
729
</para>
730
731
<para>
732
Директив <literal>js_import</literal> может быть несколько.
733
</para>
734
735
<para>
736
<note>
737
Директива может быть указана
738
на уровне <literal>server</literal> и <literal>location</literal>
739
начиная с <link doc="../njs/changes.xml" id="njs0.7.7">0.7.7</link>.
740
</note>
741
</para>
742
743
</directive>
744
745
746
<directive name="js_include">
747
<syntax><value>файл</value></syntax>
748
<default/>
749
<context>http</context>
750
751
<para>
752
Задаёт файл, позволяющий задавать обработчики location и переменных на njs:
753
<example>
754
nginx.conf:
755
js_include http.js;
756
location /version {
757
js_content version;
758
}
759
760
http.js:
761
function version(r) {
762
r.return(200, njs.version);
763
}
764
</example>
765
</para>
766
767
<para>
768
Директива устарела в версии
769
<link doc="../njs/changes.xml" id="njs0.4.0">0.4.0</link>
770
и была удалена в версии
771
<link doc="../njs/changes.xml" id="njs0.7.1">0.7.1</link>.
772
Вместо неё следует использовать директиву <link id="js_import"/>.
773
</para>
774
775
</directive>
776
777
778
<directive name="js_load_http_native_module">
779
<syntax><value>путь</value> [<literal>as</literal> <value>имя</value>]</syntax>
780
<default/>
781
<context>main</context>
782
<appeared-in>0.9.5</appeared-in>
783
784
<para>
785
Загружает <link doc="../njs/native_modules.xml">нативный модуль</link>
786
(разделяемую библиотеку) для использования в HTTP JavaScript-коде.
787
Директива работает только с движком
788
<link doc="../njs/engine.xml" id="quickjs_engine">QuickJS</link>
789
и недоступна при использовании встроенного движка njs.
790
</para>
791
792
<para>
793
Параметр <value>путь</value>
794
задаёт абсолютный путь к файлу разделяемой библиотеки.
795
Необязательный параметр <literal>as</literal> <value>имя</value>
796
задаёт псевдоним для импорта модуля в JavaScript-коде.
797
Если не указан, модуль можно импортировать по имени файла.
798
</para>
799
800
<para>
801
Пример:
802
<example>
803
js_load_http_native_module /path/to/mylib.so;
804
js_load_http_native_module /path/to/other.so as myalias;
805
806
http {
807
js_import main.js;
808
# ... остальная конфигурация http
809
}
810
</example>
811
В JavaScript-коде:
812
<example>
813
// Импорт по имени файла
814
import * as mylib from 'mylib.so';
815
816
// Импорт по псевдониму
817
import * as myalias from 'myalias';
818
819
// Использование экспортируемых функций
820
let result = mylib.add(5, 10);
821
</example>
822
</para>
823
824
<para>
825
<note>
826
В целях безопасности директива может использоваться только
827
в контексте <literal>main</literal>.
828
Нативные модули работают с полными привилегиями процесса,
829
необходимо использовать абсолютные пути и проводить проверку кода.
830
</note>
831
</para>
832
833
</directive>
834
835
836
<directive name="js_path">
837
<syntax>
838
<value>путь</value></syntax>
839
<default/>
840
<context>http</context>
841
<context>server</context>
842
<context>location</context>
843
<appeared-in>0.3.0</appeared-in>
844
845
<para>
846
Задаёт дополнительный путь для модулей njs.
847
</para>
848
849
<para>
850
<note>
851
Директива может быть указана
852
на уровне <literal>server</literal> и <literal>location</literal>
853
начиная с <link doc="../njs/changes.xml" id="njs0.7.7">0.7.7</link>.
854
</note>
855
</para>
856
857
</directive>
858
859
860
<directive name="js_periodic">
861
<syntax><value>модуль.функция</value>
862
[<literal>interval</literal>=<value>время</value>]
863
[<literal>jitter</literal>=<value>число</value>]
864
[<literal>worker_affinity</literal>=<value>маска</value>]</syntax>
865
<default/>
866
<context>location</context>
867
<appeared-in>0.8.1</appeared-in>
868
869
<para>
870
Задаёт периодичность запуска обработчика содержимого.
871
В качестве первого аргумента обработчик получает
872
<link doc="../njs/reference.xml" id="periodic_session">объект сессии</link>,
873
также у обработчика есть доступ к глобальным объектам таким как
874
<link doc="../njs/reference.xml" id="ngx">ngx</link>.
875
</para>
876
877
<para>
878
Необязательный параметр <literal>interval</literal>
879
задаёт интервал между двумя последовательными запусками,
880
по умолчанию 5 секунд.
881
</para>
882
883
<para>
884
Необязательный параметр <literal>jitter</literal>
885
задаёт время, в пределах которого
886
случайным образом задерживается каждый запуск,
887
по умолчанию задержки нет.
888
</para>
889
890
<para>
891
По умолчанию <literal>js_handler</literal> выполняется для рабочего процесса 0.
892
Необязательный параметр <literal>worker_affinity</literal>
893
позволяет указать рабочий процесс,
894
для которого будет выполняться обработчик содержимого location.
895
Рабочие процессы задаются битовой маской разрешённых к использованию рабочих
896
процессов.
897
Маска <literal>all</literal> позволяет обработчику выполняться
898
для всех рабочих процессов.
899
</para>
900
901
<para>
902
Пример:
903
<example>
904
example.conf:
905
906
location @periodics {
907
# интервал выполнения 1 минута для рабочего процесса 0
908
js_periodic main.handler interval=60s;
909
910
# интервал выполнения 1 минута для всех рабочих процессов
911
js_periodic main.handler interval=60s worker_affinity=all;
912
913
# интервал выполнения 1 минута для рабочих процессов 1 и 3
914
js_periodic main.handler interval=60s worker_affinity=0101;
915
916
resolver 10.0.0.1;
917
js_fetch_trusted_certificate /path/to/ISRG_Root_X1.pem;
918
}
919
920
example.js:
921
922
async function handler(s) {
923
let reply = await ngx.fetch('https://nginx.org/en/docs/njs/');
924
let body = await reply.text();
925
926
ngx.log(ngx.INFO, body);
927
}
928
</example>
929
</para>
930
931
</directive>
932
933
934
<directive name="js_preload_object">
935
<syntax><value>имя.json</value> |
936
<value>имя</value> from <value>файл.json</value></syntax>
937
<default/>
938
<context>http</context>
939
<context>server</context>
940
<context>location</context>
941
<appeared-in>0.7.8</appeared-in>
942
943
<para>
944
Предварительно загружает
945
<link doc="../njs/preload_objects.xml">неизменяемый объект</link>
946
во время конфигурации.
947
<literal>Имя</literal> используется в качестве имени глобальной переменной,
948
через которую объект доступен в коде njs.
949
Если <literal>имя</literal> не указано,
950
то будет использоваться имя файла.
951
<example>
952
js_preload_object map.json;
953
</example>
954
В примере <literal>map</literal> используется в качестве имени
955
во время доступа к предварительно загруженному объекту.
956
</para>
957
958
<para>
959
Директив <literal>js_preload_object</literal> может быть несколько.
960
</para>
961
962
</directive>
963
964
965
<directive name="js_set">
966
<syntax>
967
<value>$переменная</value>
968
<value>модуль.функция</value>
969
[<literal>nocache</literal>]</syntax>
970
<default/>
971
<context>http</context>
972
<context>server</context>
973
<context>location</context>
974
975
<para>
976
Задаёт <literal>функцию</literal> njs
977
для указанной <literal>переменной</literal>.
978
Начиная с <link doc="../njs/changes.xml" id="njs0.4.0">0.4.0</link>
979
можно ссылаться на функцию модуля.
980
</para>
981
982
<para>
983
Функция вызывается в момент
984
первого обращения к переменной для данного запроса.
985
Точный момент вызова функции зависит от
986
<link doc="../dev/development_guide.xml" id="http_phases">фазы</link>,
987
в которой происходит обращение к переменной.
988
Это можно использовать для реализации дополнительной логики,
989
не относящейся к вычислению переменной.
990
Например, если переменная указана
991
в директиве <link doc="ngx_http_log_module.xml" id="log_format"/>,
992
то её обработчик не будет выполняться до фазы записи в лог.
993
Этот обработчик также может использоваться для выполнения процедур
994
непосредственно перед освобождением запроса.
995
</para>
996
997
<para>
998
Начиная с <link doc="../njs/changes.xml" id="njs0.8.6">0.8.6</link>,
999
если указан необязательный параметр <literal>nocache</literal>, то
1000
обработчик выполняется каждый раз при обращении к переменной.
1001
Из-за ограничения модуля <link doc="ngx_http_rewrite_module.xml">rewrite</link>
1002
при обращении к <literal>nocache</literal>-переменной при помощи
1003
директивы <link doc="ngx_http_rewrite_module.xml" id="set">set</link>,
1004
обработчик должен возвращать значение фиксированной длины.
1005
</para>
1006
1007
<para>
1008
<note>
1009
Так как обработчик <literal>js_set</literal>
1010
должен сразу возвращать результат,
1011
то поддерживаются только синхронные операции,
1012
Таким образом, асинхронные операции, например
1013
<link doc="../njs/reference.xml" id="r_subrequest">r.subrequest()</link>
1014
или
1015
<link doc="../njs/reference.xml" id="settimeout">setTimeout()</link>,
1016
не поддерживаются.
1017
</note>
1018
</para>
1019
1020
<para>
1021
<note>
1022
Директива может быть указана
1023
на уровне <literal>server</literal> и <literal>location</literal>
1024
начиная с <link doc="../njs/changes.xml" id="njs0.7.7">0.7.7</link>.
1025
</note>
1026
</para>
1027
1028
</directive>
1029
1030
1031
<directive name="js_shared_dict_zone">
1032
<syntax>
1033
<literal>zone</literal>=<value>имя</value>:<value>размер</value>
1034
[<literal>timeout</literal>=<value>время</value>]
1035
[<literal>type</literal>=<literal>строка</literal>|<literal>число</literal>]
1036
[<literal>evict</literal>]</syntax>
1037
<default/>
1038
<context>http</context>
1039
<appeared-in>0.8.0</appeared-in>
1040
1041
<para>
1042
Задаёт <value>имя</value> и <value>размер</value> зоны разделяемой памяти,
1043
в которой хранится
1044
<link doc="../njs/reference.xml" id="dict">словарь</link> ключей и значений,
1045
разделяемый между рабочими процессами.
1046
</para>
1047
1048
<para>
1049
По умолчанию в качестве ключа и значения используется строка.
1050
Необязательный параметр <literal>type</literal>
1051
позволяет изменить тип значения на число.
1052
</para>
1053
1054
<para>
1055
Необязательный параметр <literal>timeout</literal> задаёт время в миллисекундах,
1056
по завершении которого все записи в словаре удаляются из зоны.
1057
Если для части записей требуется другое время удаления,
1058
его можно задать при помощи аргумента <literal>timeout</literal>
1059
методов
1060
<link doc="../njs/reference.xml" id="dict_add">add</link>,
1061
<link doc="../njs/reference.xml" id="dict_incr">incr</link> и
1062
<link doc="../njs/reference.xml" id="dict_set">set</link>
1063
(<link doc="../njs/changes.xml" id="njs0.8.5">0.8.5</link>).
1064
</para>
1065
1066
<para>
1067
Необязательный параметр <literal>evict</literal> удаляет самую старую
1068
пару ключ-значение при переполнении зоны.
1069
</para>
1070
1071
<para>
1072
Пример:
1073
<example>
1074
example.conf:
1075
# Создаётся словарь размером 1Мб со строковыми значениями,
1076
# пары ключ-значение удаляются при отсутствии активности в течение 60 секунд:
1077
js_shared_dict_zone zone=foo:1M timeout=60s;
1078
1079
# Создаётся словарь размером 512Кб со строковыми значениями,
1080
# удаляется самая старая пара ключ-значение при переполнении зоны:
1081
js_shared_dict_zone zone=bar:512K timeout=30s evict;
1082
1083
# Создаётся постоянный словарь размером 32Кб с числовыми значениями:
1084
js_shared_dict_zone zone=num:32k type=number;
1085
1086
example.js:
1087
function get(r) {
1088
r.return(200, ngx.shared.foo.get(r.args.key));
1089
}
1090
1091
function set(r) {
1092
r.return(200, ngx.shared.foo.set(r.args.key, r.args.value));
1093
}
1094
1095
function del(r) {
1096
r.return(200, ngx.shared.bar.delete(r.args.key));
1097
}
1098
1099
function increment(r) {
1100
r.return(200, ngx.shared.num.incr(r.args.key, 2));
1101
}
1102
</example>
1103
</para>
1104
1105
</directive>
1106
1107
1108
<directive name="js_var">
1109
<syntax><value>$переменная</value> [<value>значение</value>]</syntax>
1110
<default/>
1111
<context>http</context>
1112
<context>server</context>
1113
<context>location</context>
1114
<appeared-in>0.5.3</appeared-in>
1115
1116
<para>
1117
Объявляет
1118
<link doc="../njs/reference.xml" id="r_variables">перезаписываемую</link>
1119
переменную.
1120
В качестве значения можно использовать текст, переменные и их комбинации.
1121
Переменная не перезаписывается после перенаправления,
1122
в отличие от переменных, созданных при помощи
1123
директивы <link doc="ngx_http_rewrite_module.xml" id="set"/>.
1124
</para>
1125
1126
<para>
1127
<note>
1128
Директива может быть указана
1129
на уровне <literal>server</literal> и <literal>location</literal>
1130
начиная с <link doc="../njs/changes.xml" id="njs0.7.7">0.7.7</link>.
1131
</note>
1132
</para>
1133
1134
</directive>
1135
1136
</section>
1137
1138
1139
<section id="arguments" name="Аргумент запроса">
1140
1141
<para>
1142
Каждый HTTP-обработчик njs получает один аргумент,
1143
<link doc="../njs/reference.xml" id="http">объект</link> запроса.
1144
</para>
1145
1146
</section>
1147
1148
</module>
1149
1150