模块 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 |
设置一个将在access阶段调用的 njs 函数。自 0.4.0 起,可以引用模块函数。
该函数在流会话首次达到access阶段时被调用一次。该函数使用以下参数调用:
-
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 API 读取和写入的缓冲区的 size
。
语法: | 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 API 接收的响应的最大 size
。
语法: | js_fetch_protocols [ |
---|---|
默认值: |
js_fetch_protocols TLSv1 TLSv1.1 TLSv1.2; |
上下文: | stream ,server |
此指令出现在版本 0.7.0 中。
启用 HTTPS 连接与 Fetch API 时指定的协议。
语法: | js_fetch_timeout |
---|---|
默认值: |
js_fetch_timeout 60s; |
上下文: | stream ,server |
此指令出现在版本 0.7.4 中。
定义了Fetch API的读写超时时间。该超时时间仅在两次连续的读写操作之间设置,而不是整个响应的过程中。如果在此时间内没有传输任何数据,则连接将关闭。
语法: | js_fetch_trusted_certificate |
---|---|
默认值: | — |
上下文: | stream , server |
此指令在版本0.7.0中出现。
指定了一个以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
,则将使用文件名代替。
js_preload_object map.json;
这里使用 map
作为访问预加载对象的名称。
可以指定多个 js_preload_object
指令。
语法: | js_preread |
---|---|
默认: | — |
上下文: | stream 、server |
设置将在preread阶段调用的 njs 函数。自0.4.0起,可以引用模块函数。
该函数在流会话首次到达preread阶段时调用一次。该函数调用以下参数:
-
s
- Stream Session 对象
在此阶段,可以执行初始化或使用 s.on()
方法为每个传入的数据块注册回调,直到调用以下方法之一: s.allow()
、s.decline()
、s.done()
。调用其中一个方法后,流会话切换到下一个阶段,并且所有当前的s.on()
回调都会被删除。
由于js_preread
处理程序立即返回其结果,因此仅支持同步回调。因此,不支持异步回调,如ngx.fetch()
或setTimeout()
。尽管如此,在preread阶段的s.on()
回调中支持异步操作。有关更多信息,请参见此示例。
语法: | js_set |
---|---|
默认: | — |
上下文: | stream , server |
设置指定 variable
的一个 njs function
。自从 0.4.0 版本起,可以引用模块函数。
当首次为给定请求引用变量时调用该函数。确切的时机取决于引用变量的 阶段。这可以用来执行一些与变量评估无关的逻辑。例如,如果变量仅在 log_format 指令中引用,则其处理程序将不会在日志阶段之前执行。此处理程序可用于在请求释放之前执行一些清理。
由于 js_set
处理程序立即返回其结果,因此仅支持同步回调。因此,不支持异步回调,如 ngx.fetch() 或 setTimeout()。
该指令可以自从 0.7.7 版本起在 server
级别指定。
语法: | 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 起出现此指令。
声明一个 可写 变量。该值可以包含文本、变量及其组合。
自从 0.7.7 版本起,该指令可以在 server
级别指定。
会话对象属性
每个流 njs 处理程序接收一个参数,即流会话 对象。