ngx_stream_js_module
模块用于在 njs 中实现处理程序 —— 这是 JavaScript 语言的一个子集。
默认情况下不构建此模块。可在此处下载和安装说明。
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 function ; |
默认 | —— |
上下文 | stream、server |
设置一个将在 access 阶段调用的 njs 函数。
- | 说明 |
---|---|
语法 | js_filter function ; |
默认 | —— |
上下文 | stream、server |
设置一个数据过滤器。
- | 说明 |
---|---|
语法 | js_include file ; |
默认 | —— |
上下文 | stream |
指定一个使用 njs 实现服务器和变量处理程序的文件。
- | 说明 |
---|---|
语法 | js_preread function ; |
默认 | —— |
上下文 | stream、server |
设置一个将在 preread 阶段调用的 njs 函数。
- | 说明 |
---|---|
语法 | js_set function ; |
默认 | —— |
上下文 | stream |
设置一个用于指定变量的 njs 函数。
每一个流 njs 处理程序都会接收一个参数,一个流会话对象。
http://nginx.org/en/docs/stream/ngx_stream_js_module.html
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 key $variable zone=name ; |
默认 | —— |
上下文 | stream |
创建一个新的 $variable
,其值在键值数据库中通过 key 查找。匹配规则由 keyval_zone 指令的 type 参数定义。数据库存储在 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
模块(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 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 info | notice | warn | error ; |
默认 | limit_conn_log_level error; |
上下文 | stream、server |
为服务器限制连接数设置日志记录级别。
- | 说明 |
---|---|
语法 | 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