Mercurial > hg > nginx-site
view xml/ru/docs/stream/ngx_stream_js_module.xml @ 2178:cb431c861670
Added njs examples.
author | Yaroslav Zhuravlev <yar@nginx.com> |
---|---|
date | Tue, 05 Jun 2018 18:23:50 +0300 |
parents | cd4889fdcfa4 |
children | 523dc4cc8745 |
line wrap: on
line source
<?xml version="1.0"?> <!-- Copyright (C) Nginx, Inc. --> <!DOCTYPE module SYSTEM "../../../../dtd/module.dtd"> <module name="Модуль ngx_stream_js_module" link="/ru/docs/stream/ngx_stream_js_module.html" lang="ru" rev="11"> <section id="summary"> <para> Модуль <literal>ngx_stream_js_module</literal> позволяет задавать обработчики на <link doc="../njs_about.xml">njs</link> — подмножестве языка JavaScript. </para> <para> По умолчанию этот модуль не собирается, его необходимо собрать с модулем njs с помощью конфигурационного параметра <literal>--add-module</literal>: <example> ./configure --add-module=<value>path-to-njs</value>/nginx </example> <link url="http://hg.nginx.org/njs">Репозиторий</link> модуля njs можно клонировать следующей командой (необходим клиент <link url="https://www.mercurial-scm.org">Mercurial</link>): <example> hg clone http://hg.nginx.org/njs </example> Модуль также можно собрать как <link doc="../ngx_core_module.xml" id="load_module">динамический</link>: <example> ./configure --add-dynamic-module=<value>path-to-njs</value>/nginx </example> </para> </section> <section id="example" name="Пример конфигурации"> <para> <example> stream { js_include stream.js; js_set $foo foo; js_set $bar bar; server { listen 12345; js_preread qux; return $foo; } server { listen 12346; js_access xyz; proxy_pass 127.0.0.1:8000; js_filter baz; } } http { server { listen 8000; location / { return 200 $http_foo\n; } } } </example> </para> <para> Файл <path>stream.js</path>: <example> var req = ''; var matched = 0; var line = ''; function qux(s) { var n = s.buffer.indexOf('\n'); if (n == -1) { return s.AGAIN; } line = s.buffer.substr(0, n); } function foo(s) { return line; } function bar(s) { var v = s.variables; s.log("hello from bar() handler!"); return "foo-var" + v.remote_port + "; pid=" + v.pid; } // Фильтр обрабатывает один буфер за вызов. // Буфер недоступен в s.buffer для // чтения и записи. Вызывается в обоих направлениях. function baz(s) { if (s.fromUpstream || matched) { return; } // Отключение определённых адресов. if (s.remoteAddress.match('^192.*')) { return s.ERROR; } // Чтение строки HTTP-запроса. // Получение байт в 'req' до того как // будет прочитана строка запроса. Очистка текущего буфера // для отключения вывода. req = req + s.buffer; s.buffer = ''; var n = req.search('\n'); if (n != -1) { // Вставка нового HTTP-заголовка. var rest = req.substr(n + 1); req = req.substr(0, n + 1); var addr = s.remoteAddress; s.log('req:' + req); s.log('rest:' + rest); // Вывод результата и пропуск дальнейшей // обработки. s.buffer = req + 'Foo: addr_' + addr + '\r\n' + rest; matched = 1; } } function xyz(s) { if (s.remoteAddress.match('^192.*')) { return s.ABORT; } } </example> </para> </section> <section id="directives" name="Директивы"> <directive name="js_access"> <syntax><value>функция</value></syntax> <default/> <context>stream</context> <context>server</context> <para> Задаёт функцию njs, которая будет вызываться в <link doc="stream_processing.xml" id="access_phase">access</link>-фазе. </para> </directive> <directive name="js_filter"> <syntax><value>функция</value></syntax> <default/> <context>stream</context> <context>server</context> <para> Задаёт фильтр данных. </para> </directive> <directive name="js_include"> <syntax><value>файл</value></syntax> <default/> <context>stream</context> <para> Задаёт файл, который позволяет задавать обработчики server и переменных на njs. </para> </directive> <directive name="js_preread"> <syntax><value>функция</value></syntax> <default/> <context>stream</context> <context>server</context> <para> Задаёт функцию njs, которая будет вызываться в <link doc="stream_processing.xml" id="preread_phase">preread</link>-фазе. </para> </directive> <directive name="js_set"> <syntax> <value>$переменная</value> <value>функция</value></syntax> <default/> <context>stream</context> <para> Задаёт функцию njs для указанной переменной. </para> </directive> </section> <section id="properties" name="Свойства объекта сессии"> <para> Каждый stream-обработчик njs получает один аргумент, <link doc="../njs/njs_api.xml" id="stream_session">объект</link> stream-сессии. </para> </section> </module>