跳转至

njs: NGINX njs 动态模块

安装

您可以在任何基于 RHEL 的发行版中安装此模块,包括但不限于:

  • RedHat Enterprise Linux 7、8、9 和 10
  • CentOS 7、8、9
  • AlmaLinux 8、9
  • Rocky Linux 8、9
  • Amazon Linux 2 和 Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-njs
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-njs

通过在 /etc/nginx/nginx.conf 的顶部添加以下内容来启用模块:

load_module modules/ngx_http_js_module.so;
load_module modules/ngx_stream_js_module.so;

本文档描述了 nginx-module-njs v0.9.6,于 2026 年 3 月 3 日发布。


项目状态:活跃 - 项目已达到稳定、可用状态,并正在积极开发中。 社区支持

NGINX JavaScript 横幅

NGINX JavaScript

NGINX JavaScript,也称为 NJS,是一个用于 NGINX 的动态模块,允许使用熟悉的 JavaScript 语法扩展内置功能。NJS 语言是 JavaScript 的一个子集,符合 ES5(ECMAScript 5.1 严格变体),并具有一些 ES6(ECMAScript 6)及更新的扩展。有关更多详细信息,请参见 兼容性

工作原理

NGINX JavaScript 作为两个 动态模块 提供给 NGINX(ngx_http_js_modulengx_stream_js_module),可以在任何支持的 NGINX Open SourceNGINX Plus 安装中添加,而无需重新编译。

NJS 模块允许 NGINX 管理员: - 在请求到达上游服务器之前添加复杂的访问控制和安全检查 - 操作响应头 - 编写灵活的异步内容处理程序、过滤器等!

请参见 示例 以及我们使用 NJS 开发的各种项目:

https://github.com/nginxinc/nginx-openid-connect

扩展 NGINX Plus 功能,以直接与 OIDC 兼容的身份提供者进行通信,验证用户并授权由 NGINX Plus 提供的内容。

https://github.com/nginxinc/nginx-saml

NGINX Plus 作为 SAML 认证服务提供者的参考实现。

https://github.com/nginxinc/njs-prometheus-module

直接从 NGINX Plus 暴露 Prometheus 指标端点。

[!TIP] NJS 还可以与 NGINX Unit 应用服务器一起使用。了解有关 NGINX Unit 的 控制 API 以及如何 使用 NJS 定义函数调用 的更多信息。

下载和安装

按照以下步骤下载和安装预编译的 NGINX 和 NGINX JavaScript Linux 二进制文件。您也可以选择 从源代码本地构建模块

配置 NGINX 软件包仓库

按照 本指南 将官方 NGINX 软件包仓库添加到您的系统并安装 NGINX Open Source。如果您已经安装了 NGINX Open Source 或 NGINX Plus,请跳过最后一步中的 NGINX 安装部分。

开始使用 NGINX JavaScript

使用 NJS 涉及启用模块、添加定义了函数的 JavaScript 文件,并在 NGINX 配置文件中调用导出的函数。

验证 NGINX 是否正在运行

NGINX JavaScript 是 NGINX Open Source 或 NGINX Plus 的一个模块。如果您尚未这样做,请按照以下步骤安装 NGINX Open SourceNGINX Plus。安装后,确保 NGINX 实例正在运行并能够响应 HTTP 请求。

启动 NGINX

发出以下命令以启动 NGINX:

sudo nginx

验证 NGINX 是否响应 HTTP 请求

curl -I 127.0.0.1

您应该看到以下响应:

HTTP/1.1 200 OK
Server: nginx/1.25.5

启用 NGINX JavaScript 模块

安装后,必须在 NGINX 配置文件中包含 NJS 模块(或两个模块)。在大多数系统中,NGINX 配置文件默认位于 /etc/nginx/nginx.conf

编辑 NGINX 配置文件

sudo vi /etc/nginx/nginx.conf

启用 NJS 模块的动态加载

在顶层(“主”)上下文中使用 load_module 指令以启用一个(或两个)模块。

load_module modules/ngx_http_js_module.so;
load_module modules/ngx_stream_js_module.so;

编写 .js 脚本文件的基础知识

NJS 脚本文件通常以 .js 扩展名命名,并放置在 /etc/nginx/njs/ 目录中。它们通常由函数组成,然后导出,使其在 NGINX 配置文件中可用。

自定义对象、方法和属性的参考

NJS 提供了一组对象及其相关的方法和属性,这些对象不是 ECMAScript 定义的一部分。请参见 完整参考,了解这些对象及其如何用于进一步扩展和自定义 NGINX。

示例:Hello World

这是一个基本的“Hello World”示例。

example.js

此文件中的 hello 函数返回 HTTP 200 OK 状态响应代码,以及字符串“Hello World!”,后跟换行符。然后将该函数导出以供在 NGINX 配置文件中使用。

将此文件添加到 /etc/nginx/njs 目录:

function hello(r) {
  r.return(200, "Hello world!\n");
}

export default {hello}

nginx.conf

我们修改 NGINX 配置(/etc/nginx/nginx.conf)以导入 JavaScript 文件,并在特定情况下执行该函数。

# 加载 ngx_http_js_module 模块
load_module modules/ngx_http_js_module.so;

events {}

http {
  # 设置我们 njs JavaScript 文件的路径
  js_path "/etc/nginx/njs/";

  # 将我们的 JavaScript 文件导入到变量 "main" 中
  js_import main from http/hello.js;

  server {
    listen 80;

    location / {
      # 在所有 HTTP 请求上执行我们 JavaScript 文件中定义的 "hello" 函数
      # 并响应我们函数的内容。
      js_content main.hello;
    }
  }
}

有关 njs 指令的完整列表,请参见 ngx_http_js_modulengx_stream_js_module 模块文档页面。

[!TIP] 此示例及其他示例的更详细版本可以在官方 njs-examples 仓库 中找到。

NJS 命令行界面 (CLI)

NGINX JavaScript 安装时附带命令行界面实用程序。该接口可以作为交互式 shell 打开,或用于处理来自预定义文件或标准输入的 JavaScript 语法。由于该实用程序独立运行,因此 NGINX 特定对象,如 HTTPStream 在其运行时内不可用。

交互式 CLI 的示例用法

$ 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]
}
>>

非交互式 CLI 的示例用法

$ echo "2**3" | njs -q
8

克隆 NGINX JavaScript GitHub 仓库

使用您喜欢的方法,将 NGINX JavaScript 仓库克隆到您的开发目录。有关更多帮助,请参见 克隆 GitHub 仓库

https://github.com/nginx/njs.git

配置和构建

在您克隆的仓库的根目录中运行以下命令:

./configure

构建 NGINX JavaScript:

make

该实用程序现在应位于 <NJS_SRC_ROOT_DIR>/build/njs。有关用法的信息,请参见 NJS 命令行界面 (CLI)

克隆 NGINX GitHub 仓库

在之前克隆的 NJS 源代码仓库之外的目录中克隆 NGINX 源代码仓库。

https://github.com/nginx/nginx.git

NGINX JavaScript 技术规格

NJS 的技术规格与 NGINX 相同。

支持的发行版

有关支持的发行版的完整列表,请参见 测试的操作系统和平台

支持的部署环境

  • 容器
  • 公有云(AWS、Google Cloud Platform、Microsoft Azure)
  • 虚拟机

支持的 NGINX 版本

NGINX JavaScript 支持所有从 nginx-1.14 开始的 NGINX Open Source 版本,以及所有从 NGINX Plus R15 开始的 NGINX Plus 版本。

提问、报告问题和贡献

我们鼓励您与我们互动。有关如何提问、报告问题和贡献代码的信息,请参见 贡献 指南。

更新日志

请参见我们的 发布页面 以跟踪更新。

GitHub

您可以在 nginx-module-njs 的 GitHub 仓库 中找到此模块的其他配置提示和文档。