收录了这篇文章
njs 简介
Nginx 是C语言开发的,很多人扩展 Nginx 的功能,并未使用 C 语言开发,更常见的是使用 Lua 扩展和定制 Nginx 服务。比较著名的是 OpenResty 使用 lua-nginx-module 模块运行 Lua 语言,并集成了大量精良的 Lua 库、第三方模块,可以方便地搭建能够处理超高并发、扩展性极高的 Web 服务。
就像Atwood定律所描述一样,该来的又来了。现在最新版本的 Nginx 1.9.11+ 已经推出了 njs 模块,可以在 nginx 的配置中引入 JavaScript 脚本,从而实现一些更复杂的 nginx 配置功能。
NJS 模块并不是运行一个 Node.js, 因此 nginx JavaScript 只能像 lua 模块一样作为 nginx 的一个中间件, 无法独立作为一个完整的后台服务。njs 并没有使用 v8 解析引擎, nginx 官方基于 ECMAScript 语言规范定制了一个解析引擎。因此支持的语法和特性也与标准有所不同,所以和 Node.js 会有所不同。
node 运行时启动的虚拟机是常驻内存的,而 njs 会在每次请求时创建一个新的虚拟机并分配内存, 在请求结束时销毁该虚拟机并释放内存。
nginx 对请求的处理包含多个阶段. nginx的指令通常在某个指定的阶运行对请求进行处理. nginx 的模块也正是利用这个能力, 来调试或修改一个请求.
安装 njs 模块
要求 nginx 的版本大于 1.9.11, 因为从该版本才开始支持 load_module 指令
方法一: 安装 njs 模块
yum install nginx-module-njs
安装后,在配置文件 nginx.conf 中需要使用 load_module 指令加载 njs 动态模块。
load_module modules/ngx_http_js_module.so;
方法二: 编译时增加模块
下载源码 https://hg.nginx.org/njs,该仓库在mercurial中管理, 需要使用 hg 命令下载源码
hg clone http://hg.nginx.org/njs
nginx 编译时增加如下配置
./configure --add-module=<path to njs>/njs/nginx
NJS 模块使用示例:
nginx.conf:
http { js_import http.js; # or js_import http from http.js; server { listen 8000; location / { js_content http.hello; } } }
http.js:
function hello(r) { r.return(200, "Hello world!"); } export default { hello };
js_import : 导入一个 njs 模块,没有指定模块名称则默认为文件名称。
js_content : 使用 njs 模块里导出的方法处理这个请求。
参考:
https://www.wwwbuild.net/FrontDev/115774.html
https://zhuanlan.zhihu.com/p/447612905