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