Nginx官方文档(四十七)【ngx_stream_js_module|ngx_stream_keyval_module|ngx_stream_limit_conn_module】

公西星文
2023-12-01

ngx_stream_js_module

ngx_stream_js_module 模块用于在 njs 中实现处理程序 —— 这是 JavaScript 语言的一个子集。

默认情况下不构建此模块。可在此处下载和安装说明。

此示例适用于 njs 0.2.4 及更高版本。对于 njs 0.2.3 及更早版本,请使用此示例

示例配置

load_module modules/ngx_stream_js_module.so;
...

stream {
    js_include stream.js;

    js_set $bar bar;
    js_set $req_line req_line;

    server {
        listen 12345;

        js_preread preread;
        return     $req_line;
    }

    server {
        listen 12346;

        js_access  access;
        proxy_pass 127.0.0.1:8000;
        js_filter  header_inject;
    }
}

http {
    server {
        listen 8000;
        location / {
            return 200 $http_foo\n;
        }
    }
}

stream.js 内容:

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

指令

js_access

-说明
语法js_access function;
默认——
上下文stream、server

设置一个将在 access 阶段调用的 njs 函数。

js_filter

-说明
语法js_filter function;
默认——
上下文stream、server

设置一个数据过滤器。

js_include

-说明
语法js_include file;
默认——
上下文stream

指定一个使用 njs 实现服务器和变量处理程序的文件。

js_preread

-说明
语法js_preread function;
默认——
上下文stream、server

设置一个将在 preread 阶段调用的 njs 函数。

js_set

-说明
语法js_set function;
默认——
上下文stream

设置一个用于指定变量的 njs 函数。

会话对象属性

每一个流 njs 处理程序都会接收一个参数,一个流会话对象

原文档

http://nginx.org/en/docs/stream/ngx_stream_js_module.html


ngx_stream_keyval_module

ngx_stream_keyval_module 模块(1.13.7)可用于创建变量,变量的值从由 API 管理的键值对中获取。

此模块为商业订阅部分。

示例配置

http {

    server {
        ...
        location /api {
            api write=on;
        }
    }
}

stream {

    keyval_zone zone=one:32k state=one.keyval;
    keyval      $ssl_server_name $name zone=one;

    server {
        listen              12345 ssl;
        proxy_pass          $name;
        ssl_certificate     /usr/local/nginx/conf/cert.pem;
        ssl_certificate_key /usr/local/nginx/conf/cert.key;
    }
}

指令

keyval

-说明
语法keyval key $variable zone=name;
默认——
上下文stream

创建一个新的 $variable,其值在键值数据库中通过 key 查找。匹配规则由 keyval_zone 指令的 type 参数定义。数据库存储在 zone 参数指定的共享内存区域中。

keyval_zone

-说明
语法keyval_zone zone=name:size [state=file] [timeout=time] [type=string\|ip\|prefix] [sync];
默认——
上下文stream

设置维持键值数据库的共享内存区域的名称(name)和大小(size)。键值对通过 API 进行管理。

可选的 state 参数指定一个文件(file),该文件以 JSON 格式保存键值数据库的当前状态,并在重新启动 nginx 时保持不变。

可选的 timeout 参数(1.15.0)设置将键值对从区域中删除的时间。

可选的 type 参数(1.17.1)激活一个额外的索引,该索引针对某种类型的键匹配进行了优化,匹配规则在计算键值 $variable 时定义。

索引存储在相同的共享存储区中,因此需要额外的存储。

  • type=string

    默认配置,不启用索引;使用记录 key 和一个搜索 key 的完全匹配来执行变量查找

  • type=ip

    搜索 key 是 IPv4 或 IPv6 地址或 CIDR 范围的文字表示;要匹配记录 key,搜索 key 必须属于记录 key 指定的子网或与 IP 地址完全匹配

  • type=prefix

    使用记录 key 和搜索 key 的前缀匹配(1.17.5)执行变量查找;要与记录 key 匹配,记录 key 必须是搜索 key 的前缀

可选的 sync 参数(1.15.0)启用共享内存区域同步。同步要求设置超时(timeout)参数。

如果启用了同步,则将仅在目标群集节点上执行键值对(无论是一个还是全部)的删除操作。经过 timeout 时间后,将删除其他群集节点上相同的键值对。

原文档


ngx_stream_limit_conn_module

ngx_stream_limit_conn_module 模块(1.9.3)用于限制每个定义的 key 的连接数,特别是来自单个 IP 地址的连接数。

示例配置

stream {
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    ...

    server {

        ...

        limit_conn           addr 1;
        limit_conn_log_level error;
    }
}

指令

limit_conn

-说明
语法limit_conn zone number;
默认——
上下文stream、server

设置共享内存区域和给定 key 的最大允许连接数。超过此限制时,服务器将关闭连接。例如,以下指令:

limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
    ...
    limit_conn addr 1;
}

每次只允许一个 IP 地址一个连接。

如果指定了几个 limit_conn 指令,则将应用所有已配置的限制。

当且仅当当前级别没有 limit_conn 指令时,指令才从上级继承。

limit_conn_log_level

-说明
语法limit_conn_log_level info | notice | warn | error;
默认limit_conn_log_level error;
上下文stream、server

为服务器限制连接数设置日志记录级别。

limit_conn_zone

-说明
语法limit_conn_zone key zone=name:size;
默认——
上下文stream

为指定的共享内存区域设置参数,该区域将保留各种 key 的状态。尤其是状态包括当前的连接数。key 可以包含文本、变量及其组合(1.11.2)。不计算 key 为空的连接。用法示例:

limit_conn_zone $binary_remote_addr zone=addr:10m;

上述中,key 是一个 $binary_remote_addr 变量设置的客户端 IP 地址。$binary_remote_addr 的大小为 IPv4 地址的 4 个字节或 IPv6 地址的 16 个字节。存储状态在 32 位平台上总是占用 32 或 64 字节,在 64 位平台上占用 64 字节。一兆字节区域可以保留大约 32,000 个 32 字节状态或大约 16,000 个 64 字节状态。如果区域存储耗尽,服务器将关闭连接。

原文档

http://nginx.org/en/docs/stream/ngx_stream_limit_conn_module.html

 类似资料: