前言由于许多 web 开发并不熟悉 lua 语言. 因此 nginx 推出了 njs 模块, 可以在 nginx 的配置中引入 js 脚本, 从而实现一些更复杂的 nginx 配置功能. 以下介绍 njs 模块的特性和用法
一 安装 NJS 模块要求 nginx 的版本大于 1.9.11, 因为从该版本才开始支持 load_module 指令
方法一: 动态加载 NJS 模块注意: 不同版本的 nginx 需要相应版本的 NJS 模块. - 将 ngx_http_js_module.so 文件放在nginx 根目录的 modules 目录下,
- 在 nginx.conf 中增加引入模块
load_module modules/ngx_http_js_module.so;load_module modules/ngx_stream_js_module.so;
方法二: 编译时增加模块下载源码 https://hg.nginx.org/njs/?_ga=2.99259804.301589667.1638621670-451035464.1638621670 该仓库在mercurial中管理, 需要使用 hg 命令下载源码 hg clone http://hg.nginx.org/njs nginx 编译时增加如下配置 ./configure --add-module=<path to njs>/njs/nginx
二 NJS模块运行环境的特点NJS 模块并不是运行一个 Nodejs, 因此 nginx js 只能像 lua 模块一样作为 nginx 的一个中间件, 无法独立作为一个完整的后台服务. 与前端同学熟悉的 node 或浏览器中运行环境不同. njs 并没有使用 v8 解析引擎, nginx 官方基于 ECMAScript 语言规范定制了一个解析引擎. 因此支持的语法和特性也与标准有所不同. 1. 每次请求时创建运行时环境, 请求结束时销毁 node 运行时启动的虚拟机是常驻内存的, 且该虚拟机运行时会自动完成内存的垃圾回收. 而 NJS 会在每次请求时创建一个新的虚拟机并分配内存, 在请求结束时销毁该虚拟机并释放内存. 2. 非阻塞代码执行 njs 采用事件驱动模型对 NJS 运行时环境进行调度。当 NJS 执行阻塞操作(例如读取网络数据或发出外部子请求)时,Nginx 会挂起当前 NJS VM 的执行,并在事件完成时重新调度。因此 NJS 的代码可以以简单的线性方式来写 3. 只支持部分 ECAMA 规范的语法 NJS 基于ECMAScript 5.1 规范, 并支持 ECMAScript 6 中的部分函数 支持的语法列表 https://nginx.org/en/docs/NJS/compatibility.html?_ga=2.91935000.301589667.1638621670-451035464.1638621670 4. 集成请求处理过程 Nginx 对请求的处理包含多个阶段. Nginx的指令通常在某个指定的阶运行对请求进行处理. Nginx 的模块也正是利用这个能力, 来调试或修改一个请求. NJS 模块也是通过指令的形式, 实现在特定的阶段运行 js 代码逻辑.
三 NJS 模块支持的指令及对应的处理阶段
|