Nginx NJS 模块,在 Nginx 中运行 JavaScript
Linux 使用文档
收录了这篇文章

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

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
随机推荐
CSS 媒体特性 prefers-color-scheme
macOS 生成 icns 图标
JavaScript 鼠标事件
JavaScript 流程控制语句
WordPress 引入自定义 JavaScript 文件
MySQL 批量插入数据时如何解决重复问题
AIBOT 插件
选择排序