模块 ngx_stream_js_module
该ngx_stream_js_module模块用于在njs (JavaScript 语言的子集)中实现处理程序。
此处 提供下载和安装说明 。
配置示例
该示例从 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;
}
}
}
该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.deny();
return;
}
s.allow();
}
export default {bar, preread, req_line, header_inject, access};
指令
| 句法: |
js_access |
|---|---|
| 默认: | — |
| 语境: |
stream,server |
设置将在访问阶段 调用的 njs 函数 。从0.4.0开始,可以引用模块函数。
当流会话第一次到达访问阶段时,该函数被调用一次。使用以下参数调用该函数:
s- 流会话对象
在此阶段,可以使用s.on()
每个传入数据块的方法执行初始化或注册回调,直到调用以下方法之一:
s.allow()、
s.decline()、
s.done()。一旦调用其中一个方法,流会话处理就会切换到下一阶段
,并且所有当前
s.on()
回调都会被丢弃。
| 句法: |
js_fetch_buffer_size |
|---|---|
| 默认: |
js_fetch_buffer_size 16k; |
| 语境: |
stream,server |
该指令出现在 0.7.4 版本中。
设置用于使用Fetch APIsize进行读写的缓冲区。
| 句法: |
js_fetch_ciphers |
|---|---|
| 默认: |
js_fetch_ciphers HIGH:!aNULL:!MD5; |
| 语境: |
stream,server |
该指令出现在 0.7.0 版本中。
指定使用Fetch API 的 HTTPS 连接启用的密码。密码以 OpenSSL 库可以理解的格式指定。
可以使用“ ”命令查看完整列表openssl ciphers。
| 句法: |
js_fetch_max_response_buffer_size |
|---|---|
| 默认: |
js_fetch_max_response_buffer_size 1m; |
| 语境: |
stream,server |
该指令出现在 0.7.4 版本中。
设置使用Fetch APIsize收到的响应的
最大值。
| 句法: |
js_fetch_protocols
[ |
|---|---|
| 默认: |
js_fetch_protocols TLSv1 TLSv1.1 TLSv1.2; |
| 语境: |
stream,server |
该指令出现在 0.7.0 版本中。
使用Fetch API 启用 HTTPS 连接的指定协议。
| 句法: |
js_fetch_timeout |
|---|---|
| 默认: |
js_fetch_timeout 60s; |
| 语境: |
stream,server |
该指令出现在 0.7.4 版本中。
定义Fetch API 读写超时。超时仅在两个连续的读/写操作之间设置,而不是在整个响应中设置。如果在此时间内没有数据传输,则连接被关闭。
| 句法: |
js_fetch_trusted_certificate |
|---|---|
| 默认: | — |
| 语境: |
stream,server |
该指令出现在 0.7.0 版本中。
指定file具有 PEM 格式的可信 CA 证书,用于
通过Fetch API验证
HTTPS 证书。
| 句法: |
js_fetch_verify |
|---|---|
| 默认: |
js_fetch_verify on; |
| 语境: |
stream,server |
该指令出现在 0.7.4 版本中。
启用或禁用使用Fetch API 验证 HTTPS 服务器证书。
| 句法: |
js_fetch_verify_depth |
|---|---|
| 默认: |
js_fetch_verify_depth 100; |
| 语境: |
stream,server |
该指令出现在 0.7.0 版本中。
使用Fetch API 设置 HTTPS 服务器证书链中的验证深度。
| 句法: |
js_filter |
|---|---|
| 默认: | — |
| 语境: |
stream,server |
设置数据过滤器。从0.4.0开始,可以引用模块函数。当流会话到达内容阶段时,过滤器函数被调用一次。
使用以下参数调用过滤器函数:
s- 流会话对象
s.on()
在此阶段,可以使用每个传入数据块的方法
执行初始化或注册回调。该
s.off()
方法可用于注销回调并停止过滤。
由于js_filter处理程序立即返回其结果,因此它仅支持同步操作。 因此,不支持 诸如ngx.fetch()或 之类 的异步操作。setTimeout()
| 句法: |
js_import |
|---|---|
| 默认: | — |
| 语境: |
stream,server |
该指令出现在 0.4.0 版本中。
导入一个在 njs 中实现位置和变量处理程序的模块。export_name用作访问模块函数的命名空间。如果export_name未指定,模块名称将用作命名空间。
js_import stream.js;
在这里,模块名称stream在访问导出时用作命名空间。如果导入的模块导出foo(),
stream.foo用于引用它。
js_import可以指定
多个指令。
server从0.7.7开始,
可以在级别上指定该指令
。
| 句法: |
js_include |
|---|---|
| 默认: | — |
| 语境: |
stream |
指定在 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;
}
该指令在0.4.0 版本中已过时 ,并在0.7.1 版本中被删除 。应改用 js_import指令。
| 句法: |
js_path
|
|---|---|
| 默认: | — |
| 语境: |
stream,server |
该指令出现在0.3.0版本中。
为 njs 模块设置附加路径。
server从0.7.7开始,
可以在级别上指定该指令
。
| 句法: |
js_periodic |
|---|---|
| 默认: | — |
| 语境: |
server |
该指令出现在 0.8.1 版本中。
指定定期运行的内容处理程序。该处理程序接收一个 会话对象 作为其第一个参数,它还可以访问全局对象,例如 ngx。
可选interval参数设置两次连续运行之间的时间间隔,默认情况下为 5 秒。
可选jitter参数设置位置内容处理程序将随机延迟的时间,默认情况下没有延迟。
默认情况下,js_handler在工作进程 0 上执行。可选worker_affinity参数允许指定应在其中执行位置内容处理程序的特定工作进程。每个工作进程集由允许的工作进程的位掩码表示。该all掩码允许处理程序在所有工作进程中执行。
例子:
example.conf:
location @periodics {
# to be run at 1 minute intervals in worker process 0
js_periodic main.handler interval=60s;
# to be run at 1 minute intervals in all worker processes
js_periodic main.handler interval=60s worker_affinity=all;
# to be run at 1 minute intervals in worker processes 1 and 3
js_periodic main.handler interval=60s worker_affinity=0101;
resolver 10.0.0.1;
js_fetch_trusted_certificate /path/to/ISRG_Root_X1.pem;
}
example.js:
async function handler(s) {
let reply = await ngx.fetch('https://nginx.org/en/docs/njs/');
let body = await reply.text();
ngx.log(ngx.INFO, body);
}
| 句法: |
js_preload_object |
|---|---|
| 默认: | — |
| 语境: |
stream,server |
该指令出现在0.7.8版本中。
在配置时
预加载
不可变对象。使用name全局变量的名称,通过该名称可以在 njs 代码中使用该对象。如果name未指定,则将使用文件名。
js_preload_object map.json;
此处,map在访问预加载的对象时,将 用作名称。
js_preload_object可以指定
多个指令。
| 句法: |
js_preread |
|---|---|
| 默认: | — |
| 语境: |
stream,server |
设置一个将在预读阶段 调用的 njs 函数 。从0.4.0开始,可以引用模块函数。
当流会话第一次到达预读阶段 时,该函数被调用一次 。使用以下参数调用该函数:
s- 流会话对象
在此阶段,可以使用s.on()
每个传入数据块的方法执行初始化或注册回调,直到调用以下方法之一:
s.allow()、
s.decline()、
s.done()。当调用其中一个方法时,流会话会切换到
下一阶段
,并且所有当前
s.on()
回调都会被丢弃。
由于js_preread处理程序立即返回其结果,因此它仅支持同步回调。 因此,不支持诸如ngx.fetch()或 之类 的异步回调。不过,预读阶段 的回调setTimeout()中支持异步操作 。请参阅 此示例以获取更多信息。s.on()
| 句法: |
js_set
|
|---|---|
| 默认: | — |
| 语境: |
stream,server |
为指定function
的variable. 从0.4.0开始,可以引用模块函数。
当针对给定请求第一次引用变量时,将调用该函数。确切的时刻取决于 引用变量的阶段。这可以用来执行一些与变量求值无关的逻辑。例如,如果仅在 log_format指令中引用该变量,则其处理程序直到日志阶段才会执行。该处理程序可用于在释放请求之前进行一些清理。
由于js_set处理程序立即返回其结果,因此它仅支持同步回调。
因此,不支持
异步回调,例如
ngx.fetch()
或
setTimeout() 。
server从0.7.7开始,
可以在级别上指定该指令
。
| 句法: |
js_shared_dict_zone
|
|---|---|
| 默认: | — |
| 语境: |
stream |
该指令出现在0.8.0版本中。
设置共享内存区域的name和size,以保持工作进程之间共享键值字典
。
默认情况下,共享字典使用字符串作为键和值。可选type参数允许将值类型重新定义为数字。
可选timeout参数设置从区域中删除所有共享字典条目后的时间。
当区域存储耗尽时,可选evict参数将删除最旧的键值对。
例子:
example.conf:
# Creates a 1Mb dictionary with string values,
# removes key-value pairs after 60 seconds of inactivity:
js_shared_dict_zone zone=foo:1M timeout=60s;
# Creates a 512Kb dictionary with string values,
# forcibly removes oldest key-value pairs when the zone is exhausted:
js_shared_dict_zone zone=bar:512K timeout=30s evict;
# Creates a 32Kb permanent dictionary with number values:
js_shared_dict_zone zone=num:32k type=number;
example.js:
function get(r) {
r.return(200, ngx.shared.foo.get(r.args.key));
}
function set(r) {
r.return(200, ngx.shared.foo.set(r.args.key, r.args.value));
}
function del(r) {
r.return(200, ngx.shared.bar.delete(r.args.key));
}
function increment(r) {
r.return(200, ngx.shared.num.incr(r.args.key, 2));
}
| 句法: |
js_var |
|---|---|
| 默认: | — |
| 语境: |
stream,server |
该指令出现在0.5.3版本中。
声明一个可写 变量。该值可以包含文本、变量及其组合。
server从0.7.7开始,
可以在级别上指定该指令
。
会话对象属性
每个流 njs 处理程序接收一个参数,即流会话 对象。
