The ngx_stream_js_module module is used to implement handlers in njs — a subset of the JavaScript language.
Download and install instructions are available here.
The example works since 0.4.0.
stream {
js_import stream.js;
js_set $bar stream.bar;
js_set $req_line stream.req_line;
server {
listen 12345;
js_preread stream.preread;
return $req_line;
}
server {
listen 12346;
js_access stream.access;
proxy_pass 127.0.0.1:8000;
js_filter stream.header_inject;
}
}
http {
server {
listen 8000;
location / {
return 200 $http_foo\n;
}
}
}
The stream.js file:
var line = '';
function bar(s) {
var v = s.variables;
s.log("hello from bar() handler!");
return "bar-var" + v.remote_port + "; pid=" + v.pid;
}
function preread(s) {
s.on('upload', function (data, flags) {
var n = data.indexOf('\n');
if (n != -1) {
line = data.substr(0, n);
s.done();
}
});
}
function req_line(s) {
return line;
}
// Read HTTP request line.
// Collect bytes in 'req' until
// request line is read.
// Injects HTTP header into a client's request
var my_header = 'Foo: foo';
function header_inject(s) {
var req = '';
s.on('upload', function(data, flags) {
req += data;
var n = req.search('\n');
if (n != -1) {
var rest = req.substr(n + 1);
req = req.substr(0, n + 1);
s.send(req + my_header + '\r\n' + rest, flags);
s.off('upload');
}
});
}
function access(s) {
if (s.remoteAddress.match('^192.*')) {
s.abort();
return;
}
s.allow();
}
export default {bar, preread, req_line, access};
| Syntax: | js_access function | module.function; |
|---|---|
| Default: | — |
| Context: | stream, server |
Sets an njs function which will be called at the access phase. Since 0.4.0, a module function can be referenced.
| Syntax: | js_filter function | module.function; |
|---|---|
| Default: | — |
| Context: | stream, server |
Sets a data filter. Since 0.4.0, a module function can be referenced.
| Syntax: | js_import module.js |
export_name from module.js; |
|---|---|
| Default: | — |
| Context: | stream |
This directive appeared in version 0.4.0.
Imports a module that implements location and variable handlers in njs. The export_name is used as a namespace to access module functions. If the export_name is not specified, the module name will be used as a namespace.
js_import stream.js;
Here, the module name stream is used as a namespace while accessing exports. If the imported module contains foo(), stream.foo is used to refer to it.
Several js_import directives can be specified.
| Syntax: | js_include file; |
|---|---|
| Default: | — |
| Context: | stream |
Specifies a file that implements server and variable handlers in njs:
nginx.conf:
js_include stream.js;
js_set $js_addr address;
server {
listen 127.0.0.1:12345;
return $js_addr;
}
stream.js:
function address(s) {
return s.remoteAddress;
}
The directive is deprecated since 0.4.0, the js_import directive should be used instead.
| Syntax: | js_path
path; |
|---|---|
| Default: | — |
| Context: | stream |
This directive appeared in version 0.3.0.
Sets an additional path for njs modules.
| Syntax: | js_preread function | module.function; |
|---|---|
| Default: | — |
| Context: | stream, server |
Sets an njs function which will be called at the preread phase. Since 0.4.0, a module function can be referenced.
| Syntax: | js_set
$variable function |
module.function; |
|---|---|
| Default: | — |
| Context: | stream |
Sets an njs function for the specified variable. Since 0.4.0, a module function can be referenced.
Each stream njs handler receives one argument, a stream session object.
© 2002-2020 Igor Sysoev
© 2011-2020 Nginx, Inc.
Licensed under the BSD License.
https://nginx.org/en/docs/stream/ngx_stream_js_module.html