njt_http_js_module
1. 功能描述
njt_http_js_module 是 NJet 的一个模块,它允许在 NJet 配置中嵌入和执行 JavaScript 代码。这个模块扩展了 NJet的功能,使得你可以在请求处理的不同阶段(如重写、访问控制、日志记录等)中使用 JavaScript 进行更复杂的逻辑处理.
主要功能
- 动态处理:在 NJet 请求处理的各个阶段执行 JavaScript 代码,实现更复杂的逻辑。
- 灵活配置:通过 JavaScript 编写自定义的逻辑,而不仅仅依赖于 NJet 的配置指令。
- 增强功能:可以用于日志处理、请求重写、响应修改等多种场景。
2. 依赖模块
njet使用开源仓库编译;njs模块使用社区仓库编译(njt_http_js_module)
load_module modules/njt_http_js_module.so;3. 指令说明
3.1 js_body_filter
| Syntax: | js_body_filter module.function [buffer_type=string | buffer]; |
|---|---|
| Default: | - |
| Context: | location, if in location, limit_except |
js_body_filter 指令用于在响应体过滤阶段调用 JavaScript 函数或模块中的函数。这个指令允许你对响应体进行动态处理,如修改内容、添加水印等。
- function:要调用的 JavaScript 函数。
- module.function:要调用的模块中的 JavaScript 函数。
- [buffer_type=string | buffer]:可选参数,指定缓冲区类型,默认为 string。如果设置为 buffer,则传递给 JavaScript 函数的是二进制数据。
3.2 js_content
| Syntax: | js_content function | module.function; |
|---|---|
| Default: | - |
| Context: | lolocation, if in location, limit_except |
- function:要调用的 JavaScript 函数。
- module.function:要调用的模块中的 JavaScript 函数。
3.3 js_context_reuse
| Syntax: | js_context_reuse number; |
|---|---|
| Default: | js_context_reuse 128; |
| Context: | http, server, location |
- number:要重用的 JavaScript 上下文数量。默认值是 128。
3.4 js_engine
js_engine 指令用于选择使用的 JavaScript 引擎。
| Syntax: | js_engine njs | qjs; |
|---|---|
| Default: | js_engine njs; |
| Context: | http, server, location |
- njs:使用 NJet 的内置 JavaScript 引擎 njs。
3.5 js_fetch_buffer_size
js_fetch_buffer_size 用于设置在使用 NJet 的 JavaScript(njs)模块进行 HTTP 请求时,请求体缓冲区的大小。这个指令影响到 NJet 在处理请求体数据时的内存分配。
| Syntax: | js_fetch_buffer_size size; |
|---|---|
| Default: | Default: js_fetch_buffer_size 16k; |
| Context: | Context: http, server, location |
- size:指定缓冲区大小,默认是 16KB (16k)。
3.6 js_fetch_ciphers
js_fetch_ciphers 指令用于配置在使用 njs 进行 HTTPS 请求时,允许使用的加密套件列表。这有助于增强安全性,通过限制仅使用安全的加密方法。
| Syntax: | js_fetch_ciphers ciphers; |
|---|---|
| Default: | js_fetch_ciphers HIGH:!aNULL:!MD5; |
| Context: | http, server, location |
- ciphers:指定要使用的加密套件列表,格式遵循 OpenSSL 标准。
3.7 js_fetch_max_response_buffer_size
js_fetch_max_response_buffer_size 用于设置在使用 njs 进行 HTTP 请求时,响应体的最大缓冲区大小。这对于控制NJet 处理大响应体的能力非常重要。
| Syntax: | js_fetch_max_response_buffer_size size; |
|---|---|
| Default: | js_fetch_max_response_buffer_size 1m; |
| Context: | http, server, location |
- size:指定最大缓冲区大小,默认是 1MB (1m)。
3.8 js_fetch_protocols
| Syntax: | js_fetch_protocols [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3]; |
|---|---|
| Default: | js_fetch_protocols TLSv1 TLSv1.1 TLSv1.2; |
| Context: | http, server, location |
- 可选参数包括 TLSv1, TLSv1.1, TLSv1.2, 和 TLSv1.3,默认情况下启用前三个协议版本。
3.9 js_fetch_timeout
js_fetch_timeout 指令用于设置通过 js_fetch 方法进行HTTP请求时的超时时间。这个指令帮助控制请求的响应时间,确保不会因为长时间等待而阻塞服务器资源。
| Syntax: | js_fetch_timeout time; |
|---|---|
| Default: | js_fetch_timeout 60s; |
| Context: | http, server, location |
- time:指定超时时间,单位可以是秒(s)、毫秒(ms)等,默认值为 60s。
3.10 js_fetch_trusted_certificate
js_fetch_trusted_certificate 指令用于指定受信任的SSL证书文件。这个指令帮助确保通过 js_fetch 发起的HTTPS请求的安全性.
| Syntax: | js_fetch_trusted_certificate file; |
|---|---|
| Default: | — |
| Context: | http, server, location |
- file:指定包含受信任证书的文件路径。
3.11 js_fetch_verify
js_fetch_verify 指令用于控制是否启用对 js_fetch 请求的SSL证书验证。这个指令帮助确保通过 js_fetch 发起的HTTPS请求的安全性。
| Syntax: | js_fetch_verify on | off; |
|---|---|
| Default: | js_fetch_verify on; |
| Context: | http, server, location |
- on:启用SSL证书验证(默认值)。
- off:禁用SSL证书验证。
3.12 js_fetch_verify_depth
js_fetch_verify_depth 指令用于设置SSL证书链验证的最大深度。这个指令帮助控制NJet在验证 js_fetch 请求的SSL证书时允许的最大证书链长度。
| Syntax: | js_fetch_verify_depth number; |
|---|---|
| Default: | js_fetch_verify_depth 100; |
| Context: | http, server, location |
- number:指定证书链验证的最大深度,默认值为 100。
3.13 js_fetch_keepalive
此指令用于激活与目标服务器连接的缓存。当该参数值大于 0 时,将启用 keepalive(持久连接)功能。
| Syntax: | js_fetch_keepalive connections; |
|---|---|
| Default: | js_fetch_keepalive 0; |
| Context: | http, server, location |
connections参数设定了在每个工作进程的缓存中所保留的、到目标服务器的最大空闲 keepalive 连接数。当连接数超过此限制时,最近最少使用(LRU)的连接将被关闭。
3.14 js_fetch_keepalive_requests
| Syntax: | js_fetch_keepalive_requests number; |
|---|---|
| Default: | js_fetch_keepalive_requests 1000; |
| Context: | http, server, location |
- Keepalive 连接允许复用同一 TCP 连接处理多个请求,减少频繁建连的开销。但过度复用会导致内存积累(每个连接需占用内存资源)。此指令通过控制单连接的请求上限,平衡性能与资源消耗。
3.15 js_fetch_keepalive_time
这个指令控制一个 keepalive 连接的“总寿命”。无论这个连接是否空闲,只要从它建立开始算起达到了设置的时间(比如1小时),那么在这个连接完成最后一次请求后就会被关闭,防止连接被无限期使用。
| Syntax: | js_fetch_keepalive_time time; |
|---|---|
| Default: | js_fetch_keepalive_time 1h; |
| Context: | http, server, location |
3.16 js_fetch_keepalive_timeout
这个指令控制一个 keepalive 连接的“空闲等待时间”。如果一个连接在指定的时间内(比如60秒)没有处理任何请求,即处于空闲状态,那么它将被关闭以释放资源。
| Syntax: | js_fetch_keepalive_timeout time; |
|---|---|
| Default: | js_fetch_keepalive_timeout 60s; |
| Context: | http, server, location |
3.17 js_header_filter
js_header_filter 指令用于指定一个 JavaScript 函数或模块中的函数,该函数将在响应头生成之前被调用,允许你对响应头进行动态修改。
| Syntax: | js_header_filter function | module.function; |
|---|---|
| Default: | — |
| Context: | location, if in location, limit_except |
- function:直接指定一个全局 JavaScript 函数。
- module.function:指定一个模块中的 JavaScript 函数。
3.18 js_import
js_import 指令用于导入 JavaScript 模块或导出特定名称的模块,以便在 NJet 配置中使用。
| Syntax: | js_import module.js | export_name from module.js; |
|---|---|
| Default: | — |
| Context: | location, if in location, limit_except |
- module.js:直接导入一个 JavaScript 模块。
- export_name from module.js:从模块中导入特定名称的导出对象。
3.19 js_include
js_include 指令用于包含一个 JavaScript 文件,允许你在 NJet 配置中使用该文件中的代码。
| Syntax: | js_include file; |
|---|---|
| Default: | — |
| Context: | http |
file:指定要包含的 JavaScript 文件。
3.20 js_path
js_path 指令用于设置 JavaScript 模块的搜索路径,允许你在 NJet配置中更灵活地管理模块。
| Syntax: | js_path path; |
|---|---|
| Default: | — |
| Context: | http, server, location |
- path:指定 JavaScript 模块的搜索路径。
3.21 js_periodic
js_periodic 指令允许您在NJet配置中周期性地执行JavaScript函数或模块中的函数。这对于需要定时更新某些状态或数据的场景非常有用,例如定期清理缓存、更新统计数据等。
| Syntax: | js_periodic function | module.function [interval=time] [jitter=number] [worker_affinity=mask]; |
|---|---|
| Default: | — |
| Context: | location |
function 或 module.function:指定要周期性执行的JavaScript函数或模块中的函数。
interval=time(可选):指定执行间隔,默认单位是秒(s),也可以使用ms(毫秒)、m(分钟)等。
jitter=number(可选):添加随机延迟,防止多个工作进程同时执行该函数。jitter 的值表示最大随机延迟的时间范围。
worker_affinity=mask(可选):指定哪些工作进程将执行此函数。mask 是一个二进制掩码,每一位对应一个工作进程。
3.22 js_preload_object
js_preload_object 指令用于预先加载JSON对象到NJet环境中,这可以提高后续请求处理的速度,尤其是在频繁访问相同数据的情况下。这对于静态配置文件或不常变化的数据特别有用。
| Syntax: | js_preload_object name.json | name from file.json;[worker_affinity=mask]; |
|---|---|
| Default: | — |
| Context: | http, server, location |
- name.json:直接定义JSON对象并命名。
- name from file.json:从文件中加载JSON对象并命名。
3.23 js_set
js_set 指令用于设置一个NJet变量的值为JavaScript函数的返回结果。这对于动态生成内容或根据条件修改响应非常有用,例如动态生成HTTP头、计算用户角色等。
| Syntax: | js_set $variable function | module.function [nocache]; |
|---|---|
| Default: | — |
| Context: | http, server, location |
$variable:指定要设置的NJet变量。
function 或module.function:指定计算该变量值的JavaScript函数或模块中的函数。
nocache(可选):禁用缓存,确保每次都重新计算
3.24 js_shared_dict_zone
js_shared_dict_zone 指令用于创建共享字典区,供JavaScript代码在不同请求之间共享数据。这对于需要跨请求保持状态的应用程序非常重要,例如会话管理、计数器等。
| Syntax: | Syntax: js_shared_dict_zone zone=name:size [timeout=time] [type=string|number] [evict]; |
|---|---|
| Default: | — |
| Context: | http |
- zone=name:size:指定共享字典区的名字和大小。
- timeout=time(可选):设置条目过期时间。
- type=string|number(可选):指定存储的数据类型,默认是字符串。
- evict(可选):当达到容量限制时,启用驱逐策略。
3.25 js_var
js_var指令用于定义一个 NJet 变量,并可选地为其赋值。这个变量可以在 JavaScript 代码中使用,以便在 NJet 配置和 JavaScript 之间传递数据。
| Syntax: | js_var $variable [value]; |
|---|---|
| Default: | — |
| Context: | http, server, location |
- $variable:要定义的 NJet 变量名。
- [value]:可选参数,为变量赋初始值。