Nginx NJS 模块,在 Nginx 中运行 JavaScript

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

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
真诚赞赏,手留余香
赞赏
随机推荐
ReferenceError: __dirname is not defined in ES module scope
WordPress关闭自动草稿
JavaScript 和 CSS 检测横屏适配
Nginx 的 location 设置
Land 主题
JavaScript 的历史
数据库中间表应该如何命名
Node.js MySQL 连接池和事务