Nginx

ngx_stream_js_module

Module ngx_stream_js_module

  • 示例配置

  • 指令

  • js_access

  • js_filter

  • js_include

  • js_preread

  • js_set

  • 会话对象属性

ngx_stream_js_module模块用于实现nginScript中的处理程序 - JavaScript语言的一个子集。

此模块不是默认生成的,它应该使用--add-module配置参数与nginScript模块一起编译:

./configure --add-module=path-to-njs/nginx

具有nginScript模块的存储库可以使用以下命令克隆(需要Mercurial客户端):

hg clone http://hg.nginx.org/njs

该模块也可以构建为动态:

./configure --add-dynamic-module=path-to-njs/nginx

示例配置

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; } } }

The stream.js file:

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; } // The filter processes one buffer per call. // The buffer is available in s.buffer both for // reading and writing. Called for both directions. function baz(s) { if (s.fromUpstream || matched) { return; } // Disable certain addresses. if (s.remoteAddress.match('^192.*')) { return s.ERROR; } // Read HTTP request line. // Collect bytes in 'req' until request // line is read. Clear current buffer to // disable output. req = req + s.buffer; s.buffer = ''; var n = req.search('\n' if (n != -1) { // Inject a new HTTP header. var rest = req.substr(n + 1 req = req.substr(0, n + 1 var addr = s.remoteAddress; s.log('req:' + req s.log('rest:' + rest // Output the result and skip further // processing. s.buffer = req + 'Foo: addr_' + addr + '\r\n' + rest; matched = 1; } } function xyz(s) { if (s.remoteAddress.match('^192.*')) { return s.ABORT; } }

指令

句法:js_access函数;
默认:
语境:流,服务器

设置将在访问阶段调用的nginScript函数。

句法:js_filter函数;
默认:
语境:流,服务器

设置数据过滤器。

句法:js_include文件;
默认:
语境:

指定一个在nginScript中实现服务器和变量处理程序的文件。

句法:js_preread函数;
默认:
语境:流,服务器

设置将在预读阶段调用的nginScript函数。

句法:js_set $ variable函数;
默认:
语境:

为指定变量设置nginScript函数。

会话对象属性

每个流nginScript处理程序都会收到一个参数,一个流会话对象。

会话对象具有以下属性:

remoteAddress客户端地址,只读eof布尔型只读属性,如果当前缓冲区是最后一个缓冲区fromUpstream,则为true布尔型只读属性,如果当前缓冲区来自上游服务器到客户端buffer,则为true 当前缓冲区,可写variables{}nginx变量对象,只读OKOK返回码DECLINEDDECLINED返回码AGAINAGAIN返回码ERRORERROR返回码ABORTABORT返回码

会话对象具有以下方法:

log(string)写一个发送string到错误日志