nginScript 初窥

栏目: 服务器 · 发布时间: 6年前

内容简介:几年前就有消息称,Nginx 官方要实现一个 JavaScript 实现,作为钦点的内置脚本语言。后来这个实现就被称作这里有来自 Nginx 的一些介绍:根据介绍,njs 将会以 ECMAScript 5 作为标准,并且增加部分 ECMAScript 6 的功能,以及一部分自己的扩展。

几年前就有消息称,Nginx 官方要实现一个 JavaScript 实现,作为钦点的内置脚本语言。后来这个实现就被称作 nginScript ,简称 njs

这里有来自 Nginx 的一些介绍: https://nginx.org/en/docs/njs_about.html

根据介绍,njs 将会以 ECMAScript 5 作为标准,并且增加部分 ECMAScript 6 的功能,以及一部分自己的扩展。

njs 项目本身,实际上是一个完全独立的 JavaScript 执行环境,可以单独拿出来使用。同时也会提供两个 Nginx 的扩展模块,用来与 Nginx 集成:

这两个模块顾名思义,分别在 Nginx 处理 HTTP 和 stream(TCP/UDP) 请求时使用。

之前 Nginx 还发布了 一篇博客 来介绍 njs,并阐述了 njs 的定位。从博客来看,njs 的目标与现在在社区中很流行的 lua 模块,以及 OpenResty 定位上重合度还是蛮高的。

njs 与目前的 lua 模块不同的是,lua 模块使用的是原有的 lua 实现,集成在 Nginx 中,但不论是标准的 lua 实现,还是性能更好的 luajit,都不是针对 Nginx 环境进行设计的。

而 njs 是从一开始,就针对 Nginx 环境进行了设计,理论上讲可以有更多性能优化的空间。比如 njs 的实例,被设计成了非常轻量化的实现,不论内存占用,还是启动时间,都比 lua 有更大的优势。因此在前面提到的 ngx_http_js_module 中,njs 可以做到每处理一个请求,就创建一个对应的实例来执行代码,而不像 lua 模块那样,整个进程复用一个 lua 实例。

这样带来了一个好处,njs 的内存申请可以像 Nginx 本身的实现一样,每次处理一个请求的时候,就申请一块内存,来作为这次请求专门的内存空间,不必多次小块的调用 malloc。并且在一次请求处理结束之后,整块的回收掉这块内存,这样 GC 的开销就可以避免了。而 lua 作为一个通用的编程语言实现,GC 的实现也是需要针对各种不同场景的,因此没有办法做到这种专门的优化。

安装

因为 njs 没有正式发布,目前最好的安装方式是直接通过源码编译。编译的方式和大部分 Nginx 模块一样,只要在编译 Nginx 时,在 configure 时指定一下就可以:

$ ./configure --add-module=path-to-njs/nginx/

使用

尝试了一下 ngx_http_js_module ,十分简单。这里是 nginx.conf

daemon off;  
master_process off;  
error_log stderr debug;

events {  
    worker_connections  1024;
}

http {  
    js_include hello.js;

    server {
        listen       8080;

        location / {
            js_content hello;
        }
    }
}

配置里开启了一些方便 debug 的功能,比如关闭后台运行,并且直接在主进程中处理请求,以及将日志直接打印在了 stderr 上。

配置文件中的 js_include 指令是引入一个 JS 文件, hello.js 的内容是:

function hello(req, res) {  
  var s = 'Hello nginxScript!';
  req.log('hello!');
  res.status = 200;
  res.sendHeader();
  res.contentLength = s.length;
  res.send(s);
  res.finish();
}

然后在具体的某个 location 里,可以使用 js_content ,来指定一个 JS 函数来处理请求。不得不说,目前的 API 设计,和 Node.JS 的 http 模块很像。

除了这种方法之外,还可以通过 js_set 这个指令,将一个 JS 函数指定给某个 Nginx 变量。这样可以在 location 中像正常的 Nginx 变量一样使用这个变量,实际处理强求的时候,会执行这个 JS 函数,并将函数返回值绑定到变量上。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

注意力经济: 如何把大众的注意力变成生意

注意力经济: 如何把大众的注意力变成生意

吴修铭 / 中信出版集团股份有限公司 / 2018-4-1 / 69

编辑推荐 这本书由万维钢作序,并在《得到》日课中多次推荐!中文版未上市之前,中文前沿媒体就在力推这本书!关于注意力争夺战的历史和现在,作者给了权威的梳理和定位! 百年来,在争夺注意力的战场上,媒体、广告、商人、企业和大众成为博弈的主角。商人是如何在注意力争夺战中获利的?媒体是如何在改变报道形式的?广告是如何进化的?以及,营销是如何变得随处可见、无孔不入的呢?这本书讲述了令商人或企业从吸......一起来看看 《注意力经济: 如何把大众的注意力变成生意》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具