首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ngx_stream_js_module

  • 示例配置
  • 指令
  • js_access
  • js_filter
  • js_include
  • js_preread
  • js_set
  • 会话对象属性

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

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

代码语言:javascript
复制
./configure --add-module=path-to-njs/nginx

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

代码语言:javascript
复制
hg clone http://hg.nginx.org/njs

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

代码语言:javascript
复制
./configure --add-dynamic-module=path-to-njs/nginx

示例配置

代码语言:javascript
复制
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:

代码语言:javascript
复制
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到错误日志

扫码关注腾讯云开发者

领取腾讯云代金券