NGINX JavaScript,也称为 NJS,是 NGINX 的动态模块,可以使用熟悉的 JavaScript 语法扩展内置功能。 NJS 语言是 JavaScript 的子集,符合 ES5 (ECMAScript 5.1 Strict Variant) 以及一些 ES6 (ECMAScript 6) 和更新的扩展。有关更多详细信息,请参阅兼容性。
NGINX JavaScript 作为 NGINX 的两个动态模块(ngx_http_js_module 和 ngx_stream_js_module)提供,可以添加到任何受支持的 NGINX 开源或 NGINX Plus 安装中,而无需重新编译。
NJS 模块允许 NGINX 管理员:
查看示例以及我们使用 NJS 开发的各种项目:
扩展 NGINX Plus 功能以直接与 OIDC 兼容的身份提供商进行通信,对用户进行身份验证并授权 NGINX Plus 交付的内容。
NGINX Plus 作为 SAML 身份验证服务提供者的参考实现。
直接从 NGINX Plus 公开 Prometheus 指标端点。
提示
NJS 还可以与 NGINX Unit 应用服务器一起使用。了解有关 NGINX Unit 的控制 API 以及如何使用 NJS 定义函数调用的更多信息。
按照以下步骤下载并安装预编译的 NGINX 和 NGINX JavaScript Linux 二进制文件。您还可以选择从源代码在本地构建模块。
按照本指南将官方 NGINX 软件包存储库添加到您的系统并安装 NGINX 开源。如果您已经安装了 NGINX Open Source 或 NGINX Plus,请跳过最后一步中的 NGINX 安装部分。
配置存储库后,您可以通过发出以下命令来安装 NJS:
sudo apt install nginx-module-njs
sudo yum install nginx-module-njs
sudo apk add nginx-module-njs@nginx
sudo zypper install nginx-module-njs
提示
包存储库包含一个启用调试符号的备用模块。尽管不建议用于生产环境,但该模块在开发基于 NJS 的配置时可能会有所帮助。要下载并安装模块的调试版本,请将上一个命令中的模块名称替换为nginx-module-njs-dbg
。
软件包安装脚本安装两个模块,支持 NGINX http
和stream
上下文。
ngx_http_js_模块
该 NJS 模块可以对通过 HTTP 传输的数据进行操作。
ngx_stream_js_模块
该 NJS 模块可以对通过 TCP 和 UDP 等流协议传输的数据进行操作。
默认情况下,这两个模块都安装到/etc/nginx/modules
目录中。
NJS 的使用包括启用模块、添加具有定义函数的 JavaScript 文件以及调用 NGINX 配置文件中的导出函数。
NGINX JavaScript 是 NGINX Open Source 或 NGINX Plus 的模块。如果您还没有这样做,请按照以下步骤安装 NGINX Open Source 或 NGINX Plus。安装后,确保 NGINX 实例正在运行并且能够响应 HTTP 请求。
发出以下命令来启动 NGINX:
sudo nginx
curl -I 127.0.0.1
您应该看到以下响应:
HTTP/1.1 200 OK
Server: nginx/1.25.5
安装后,其中一个(或两个)NJS 模块必须包含在 NGINX 配置文件中。在大多数系统上,NGINX 配置文件默认位于/etc/nginx/nginx.conf
。
sudo vi /etc/nginx/nginx.conf
在顶级(“主”)上下文中使用 load_module 指令来启用其中一个(或两个)模块。
load_module modules/ngx_http_js_module.so;
load_module modules/ngx_stream_js_module.so;
NJS 脚本文件通常以 .js 扩展名命名,并放置在/etc/nginx/njs/
目录中。它们通常由导出的函数组成,使它们可以在 NGINX 配置文件中使用。
NJS 提供了具有相关方法和属性的对象集合,这些方法和属性不属于 ECMAScript 定义的一部分。查看这些对象的完整参考以及如何使用它们来进一步扩展和自定义 NGINX。
这是一个基本的“Hello World”示例。
此文件中的hello
函数返回 HTTP 200 OK 状态响应代码以及字符串“Hello World!”,后跟换行符。然后导出该函数以在 NGINX 配置文件中使用。
将此文件添加到/etc/nginx/njs
目录中:
function hello ( r ) {
r . return ( 200 , "Hello world!n" ) ;
}
export default { hello }
我们修改 NGINX 配置( /etc/nginx/nginx.conf
)以导入 JavaScript 文件并在特定情况下执行该函数。
# Load the ngx_http_js_module module
load_module modules/ngx_http_js_module.so;
events {}
http {
# Set the path to our njs JavaScript files
js_path "/etc/nginx/njs/" ;
# Import our JavaScript file into the variable "main"
js_import main from http/hello.js;
server {
listen 80 ;
location / {
# Execute the "hello" function defined in our JavaScript file on all HTTP requests
# and respond with the contents of our function.
js_content main.hello;
}
}
}
有关 njs 指令的完整列表,请参阅 ngx_http_js_module 和 ngx_stream_js_module 模块文档页面。
提示
此示例和其他示例的更详细版本可以在官方 njs-examples 存储库中找到。
NGINX JavaScript 使用命令行界面实用程序安装。该界面可以作为交互式 shell 打开,也可以用于处理来自预定义文件或标准输入的 JavaScript 语法。由于该实用程序独立运行,因此 NGINX 特定的对象(例如 HTTP 和 Stream)在其运行时不可用。
$ njs
>> globalThis
global {
njs: njs {
version : '0.8.4'
} ,
global : [ Circular ] ,
process : process {
argv : [ '/usr/bin/njs' ] ,
env : {
PATH : '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' ,
HOSTNAME : 'f777c149d4f8' ,
TERM : 'xterm' ,
NGINX_VERSION : '1.25.5' ,
NJS_VERSION : '0.8.4' ,
PKG_RELEASE : '1~buster' ,
HOME : '/root'
}
} ,
console : {
log : [ Function : native ] ,
dump : [ Function : native ] ,
time : [ Function : native ] ,
timeEnd : [ Function : native ]
} ,
print : [ Function : native ]
}
>>
$ echo " 2**3 " | njs -q
8
以下步骤可用于将 NGINX JavaScript 构建为要集成到 NGINX 中的动态模块或独立的二进制文件以用作命令行界面实用程序。
重要的
要构建与 NGINX 一起使用的模块,您还需要按照本文档中概述的步骤克隆、配置和构建 NGINX。
大多数 Linux 发行版需要安装多个依赖项才能构建 NGINX 和 NGINX JavaScript。以下说明特定于apt
包管理器,在大多数 Ubuntu/Debian 发行版及其衍生版本上广泛使用。
sudo apt install gcc make
sudo apt install libpcre3-dev zlib1g-dev libssl-dev libxml2-dev libxslt-dev
要使用 QuickJS 进行构建,您还需要构建 QuickJS 库:
git clone https://github.com/bellard/quickjs
cd quickjs
CFLAGS= ' -fPIC ' make libquickjs.a
警告
这是构建 NGINX 和 NJS 所需的最小依赖库集。如果您选择使用附加模块构建 NGINX,则可能需要其他依赖项。监视以下部分中讨论的configure
命令的输出,以获取有关可能缺少哪些模块的信息。
使用您喜欢的方法,将 NGINX JavaScript 存储库克隆到您的开发目录中。请参阅克隆 GitHub 存储库以获取更多帮助。
https://github.com/nginx/njs.git
以下步骤是可选的,仅当您选择将 NJS 构建为独立实用程序时才需要。
要使用 NJS 交互式 shell,您需要安装 libedit-dev 库
sudo apt install libedit-dev
从克隆存储库的根目录运行以下命令:
./configure
构建 NGINX JavaScript:
make
该实用程序现在应该位于
。有关使用信息,请参阅 NJS 命令行界面 (CLI)。
将 NGINX 源代码存储库克隆到先前克隆的 NJS 源代码存储库之外的目录中。
https://github.com/nginx/nginx.git
要将 NGINX JavaScript 构建为动态模块,请从 NGINX 源代码存储库的根目录执行以下命令:
auto/configure --add-dynamic-module= < NJS_SRC_ROOT_DIR > /nginx
要使用 QuickJS 支持进行构建,请使用--with-cc-opt=
和--with-ld-opt=
选项提供包含和库路径:
auto/configure --add-dynamic-module= < NJS_SRC_ROOT_DIR > /nginx --with-cc-opt= " -I" --with-ld-opt= " -L"
警告
默认情况下,此方法只会构建ngx_http_js_module
模块。要将 NJS 与 NGINX Stream 模块一起使用,您需要在configure
步骤中启用它,以便它使用 NGINX 二进制文件进行构建。这样做会在 NJS 添加到构建时自动编译ngx_stream_js_module
模块。实现此目的的一种方法是将configure
步骤更改为:
auto/configure --with-stream --add-dynamic-module= < NJS_SRC_ROOT_DIR > /nginx
编译模块
make
提示
要构建将 NGINX JavaScript 嵌入到单个二进制文件中的 NGINX,请将configure
步骤更改为以下内容:
auto/configure --add-module= < NJS_SRC_ROOT_DIR > /nginx
如果构建为动态模块,则 NGINX JavaScript 模块将在
目录中可用。然后可以将模块复制到现有的 NGINX 安装并启用。有关详细信息,请参阅启用 NGINX JavaScript 模块。
或者,您可以选择通过发出以下命令来安装构建的 NGINX 和 NGINX JavaScript 二进制文件:
重要的
如果作为标准(非动态)模块内置到 NGINX 二进制文件中,这将是最简单的安装方法
make install
默认情况下,NGINX 二进制文件将安装到/usr/local/nginx/sbin/nginx
中。 NGINX JavaScript 模块将被复制到/usr/local/nginx/modules/
。
NJS 的技术规范与 NGINX 的技术规范相同。
有关受支持发行版的完整列表,请参阅经过测试的操作系统和平台。
从 nginx-1.14 开始的所有 NGINX 开源版本以及从 NGINX Plus R15 开始的所有 NGINX Plus 版本都支持 NGINX JavaScript。
我们鼓励您与我们互动。请参阅贡献指南,了解如何提出问题、报告问题和贡献代码的信息。
请参阅我们的发布页面以跟踪更新。
2 条款 BSD 类许可证
其他文档位于:https://nginx.org/en/docs/njs/
©2024 F5, Inc. 保留所有权利。 https://www.f5.com/products/nginx