模块 ngx_http_js_module
ngx_http_js_module
模块用于在 njs 中实现位置和变量处理程序,njs 是 JavaScript 语言的一个子集。
下载和安装说明 在此 处提供。
示例配置
该示例自 0.4.0 起生效。
http { js_import http.js; js_set $foo http.foo; js_set $summary http.summary; js_set $hash http.hash; resolver 10.0.0.1; server { listen 8000; location / { add_header X-Foo $foo; js_content http.baz; } location = /summary { return 200 $summary; } location = /hello { js_content http.hello; } # since 0.7.0 location = /fetch { js_content http.fetch; js_fetch_trusted_certificate /path/to/ISRG_Root_X1.pem; } # since 0.7.0 location = /crypto { add_header Hash $hash; return 200; } } }
http.js
文件
function foo(r) { r.log("hello from foo() handler"); return "foo"; } function summary(r) { var a, s, h; s = "JS summary\n\n"; s += "Method: " + r.method + "\n"; s += "HTTP version: " + r.httpVersion + "\n"; s += "Host: " + r.headersIn.host + "\n"; s += "Remote Address: " + r.remoteAddress + "\n"; s += "URI: " + r.uri + "\n"; s += "Headers:\n"; for (h in r.headersIn) { s += " header '" + h + "' is '" + r.headersIn[h] + "'\n"; } s += "Args:\n"; for (a in r.args) { s += " arg '" + a + "' is '" + r.args[a] + "'\n"; } return s; } function baz(r) { r.status = 200; r.headersOut.foo = 1234; r.headersOut['Content-Type'] = "text/plain; charset=utf-8"; r.headersOut['Content-Length'] = 15; r.sendHeader(); r.send("nginx"); r.send("java"); r.send("script"); r.finish(); } function hello(r) { r.return(200, "Hello world!"); } // since 0.7.0 async function fetch(r) { let results = await Promise.all([ngx.fetch('https://nginxserver.cn/'), ngx.fetch('https://nginxserver.cn/en/')]); r.return(200, JSON.stringify(results, undefined, 4)); } // since 0.7.0 async function hash(r) { let hash = await crypto.subtle.digest('SHA-512', r.headersIn.host); r.setReturnValue(Buffer.from(hash).toString('hex')); } export default {foo, summary, baz, hello, fetch, hash};
指令
语法 |
js_body_filter |
---|---|
默认值 | — |
上下文 |
location 、if in location 、limit_except |
此指令出现在 0.5.2 版本中。
将 njs 函数设置为响应正文过滤器。对于响应正文的每个数据块,使用以下参数调用过滤器函数
r
- HTTP 请求 对象
data
-
传入的数据块,可能是字符串或 Buffer,具体取决于
buffer_type
值,默认情况下是字符串。 flags
-
具有以下属性的对象
last
- 布尔值,如果 data 是最后一个缓冲区,则为 true。
过滤器函数可以通过调用 r.sendBuffer()
将其输入数据块的修改版本传递给下一个正文过滤器。例如,要转换响应正文中的所有小写字母
function filter(r, data, flags) { r.sendBuffer(data.toLowerCase(), flags); }
要停止过滤(后续数据块将在不调用 js_body_filter
的情况下传递给客户端),可以使用 r.done()
。
如果过滤器函数更改了响应正文的长度,则需要在 js_header_filter
中清除“Content-Length”响应头(如果存在)以强制使用分块传输编码。
由于 js_body_filter
处理程序会立即返回其结果,因此它仅支持同步操作。因此,不支持异步操作,例如 r.subrequest() 或 setTimeout()。
自 0.7.7 起,可以在 if 块中指定该指令。
语法 |
js_content |
---|---|
默认值 | — |
上下文 |
location 、if in location 、limit_except |
将 njs 函数设置为位置内容处理程序。自 0.4.0 起,可以引用模块函数。
自 0.7.7 起,可以在 if 块中指定该指令。
语法 |
js_fetch_buffer_size |
---|---|
默认值 |
js_fetch_buffer_size 16k; |
上下文 |
http 、server 、location |
此指令出现在 0.7.4 版本中。
设置用于使用 Fetch API 进行读取和写入的缓冲区的 size
。
语法 |
js_fetch_ciphers |
---|---|
默认值 |
js_fetch_ciphers HIGH:!aNULL:!MD5; |
上下文 |
http 、server 、location |
此指令出现在 0.7.0 版本中。
使用 Fetch API 指定 HTTPS 请求的启用密码。密码以 OpenSSL 库理解的格式指定。
可以使用“openssl ciphers
”命令查看完整列表。
语法 |
js_fetch_max_response_buffer_size |
---|---|
默认值 |
js_fetch_max_response_buffer_size 1m; |
上下文 |
http 、server 、location |
此指令出现在 0.7.4 版本中。
设置使用 Fetch API 接收的响应的最大 size
。
语法 |
js_fetch_protocols [ |
---|---|
默认值 |
js_fetch_protocols TLSv1 TLSv1.1 TLSv1.2; |
上下文 |
http 、server 、location |
此指令出现在 0.7.0 版本中。
使用 Fetch API 为 HTTPS 请求启用指定的协议。
语法 |
js_fetch_timeout |
---|---|
默认值 |
js_fetch_timeout 60s; |
上下文 |
http 、server 、location |
此指令出现在 0.7.4 版本中。
为 Fetch API 的读取和写入定义超时。超时仅在两次连续的读/写操作之间设置,而不是针对整个响应。如果在此时间内未传输任何数据,则连接将关闭。
语法 |
js_fetch_trusted_certificate |
---|---|
默认值 | — |
上下文 |
http 、server 、location |
此指令出现在 0.7.0 版本中。
指定一个 file
,其中包含 PEM 格式的可信 CA 证书,用于使用 Fetch API 验证 HTTPS 证书。
语法 |
js_fetch_verify |
---|---|
默认值 |
js_fetch_verify on; |
上下文 |
http 、server 、location |
此指令出现在 0.7.4 版本中。
使用 Fetch API 启用或禁用对 HTTPS 服务器证书的验证。
语法 |
js_fetch_verify_depth |
---|---|
默认值 |
js_fetch_verify_depth 100; |
上下文 |
http 、server 、location |
此指令出现在 0.7.0 版本中。
使用 Fetch API 设置 HTTPS 服务器证书链中的验证深度。
语法 |
js_header_filter |
---|---|
默认值 | — |
上下文 |
location 、if in location 、limit_except |
此指令出现在 0.5.1 版本中。
将 njs 函数设置为响应头过滤器。该指令允许更改响应头的任意头字段。
由于 js_header_filter
处理程序立即返回其结果,因此它仅支持同步操作。因此,不支持异步操作,例如 r.subrequest() 或 setTimeout()。
自 0.7.7 起,可以在 if 块中指定该指令。
语法 |
js_import |
---|---|
默认值 | — |
上下文 |
http 、server 、location |
此指令出现在 0.4.0 版中。
导入在 njs 中实现位置和变量处理程序的模块。export_name
用作访问模块函数的命名空间。如果未指定 export_name
,则模块名称将用作命名空间。
js_import http.js;
此处,模块名称 http
用作访问导出时的命名空间。如果导入的模块导出 foo()
,则使用 http.foo
引用它。
可以指定多个 js_import
指令。
自 0.7.7 起,可以在server
和location
级别指定该指令。
语法 |
js_include |
---|---|
默认值 | — |
上下文 |
http |
指定在 njs 中实现位置和变量处理程序的文件
nginx.conf: js_include http.js; location /version { js_content version; } http.js: function version(r) { r.return(200, njs.version); }
该指令在 0.4.0 版中已弃用,并在 0.7.1 版中被移除。应改用 js_import 指令。
语法 |
js_path |
---|---|
默认值 | — |
上下文 |
http 、server 、location |
此指令出现在 0.3.0 版中。
为 njs 模块设置附加路径。
自 0.7.7 起,可以在server
和location
级别指定该指令。
语法 |
js_periodic |
---|---|
默认值 | — |
上下文 |
location |
此指令出现在 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://nginxserver.cn/en/docs/njs/'); let body = await reply.text(); ngx.log(ngx.INFO, body); }
语法 |
js_preload_object |
---|---|
默认值 | — |
上下文 |
http 、server 、location |
此指令出现在 0.7.8 版中。
在配置时预加载 不可变对象。name
用作全局变量的名称,通过该变量可以在 njs 代码中使用该对象。如果未指定 name
,则将使用文件名代替。
js_preload_object map.json;
此处,map
用作访问预加载对象时的名称。
可以指定多个 js_preload_object
指令。
语法 |
js_set |
---|---|
默认值 | — |
上下文 |
http 、server 、location |
为指定的 variable
设置 njs function
。自 0.4.0 起,可以引用模块函数。
当在给定请求中首次引用变量时将调用该函数。确切时间取决于引用变量的 阶段。这可用于执行与变量评估无关的一些逻辑。例如,如果仅在 log_format 指令中引用变量,则其处理程序将不会执行,直到日志阶段。此处理程序可用于在释放请求之前执行一些清理操作。
由于 js_set
处理程序立即返回其结果,因此它仅支持同步操作。因此,不支持异步操作,例如 r.subrequest() 或 setTimeout()。
自 0.7.7 起,可以在server
和location
级别指定该指令。
语法 |
js_shared_dict_zone |
---|---|
默认值 | — |
上下文 |
http |
此指令出现在版本 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 |
---|---|
默认值 | — |
上下文 |
http 、server 、location |
此指令出现在版本 0.5.3 中。
声明 可写 变量。该值可以包含文本、变量及其组合。与使用 set 指令创建的变量不同,在重定向后不会覆盖该变量。
自 0.7.7 起,可以在server
和location
级别指定该指令。
请求参数
每个 HTTP njs 处理程序接收一个参数,即请求 对象。