nginx-njs
2015年9月,nginx宣布支持类JavaScript语言。
- nginScript是以nginx插件的方式存在。 插件名叫:njs 。和其他nginx插件一样,需要重新编译nginx来完成安装。
- nginScript是JavaScript/ECMAscript的子集 。它实现了大部分的JavaScript语言的能力,没有完全遵从ECMAScript标准,同时抛弃了JavaScript比较难懂的部分。
- nginScript不是通过V8引擎实现的 。而是通过一个更小、能耗更低、更符合nginx应用场景的小虚拟机(VM)来实现。可以理解为nginx为其实现了一套自己的词法解析。
- nginScript是跑在nginx的配置文件里。 比如:nginx.conf文件里。所以nginScript可以完成传统配置文件所能处理的所有事情,同时可以让配置管理动态化。这也是nginScript出现的最重要的原因。
nginx-njs模块分析
ngx_http_js_module
js_content content阶段
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
clcf->handler = ngx_http_js_content_handler;
ngx_stream_js_module
upstream模块
nginx-njs安装配置
- 下载njs插件
https://github.com/nginx/njs
安装
(1) 在目录njs下编译:
./configure make
生成build/libnjs.a
(2)configure配置与安装
--add-module="path/njs/nginx"
配置与运行
http.js
function hello(r) { var out = {name: "nginx-upstream"}; r.return(200, JSON.stringify(out)); } export default {hello};
nginx.conf配置
http { js_import http.js; server { listen 80; server_name www.test.com; location /njs-test { js_content http.hello; } } }
运行结果:
curl http://127.0.0.1/njs-test {"name":"nginx-upstream"}
小结
lua与njs比较
- Nginx+lua已经很成熟:lua插件由淘宝tengine(或openresty)开发,已经非常成熟商用;并开发了大量的lua插件;
- nginx现在才出来nginx+javascript插件,如果早点出来,可能没有lua什么事了。
njs插件不够成熟;
js代码编写比lua更加方便;
lua和njs可用作API控制接入层,最好不要用来开发复杂的业务逻辑。
- 可以考虑用nginx + nodejs架构;后端用nodejs开发业务逻辑。—— 效率极高。
FAQ
openresty与nginx-njs比较分析
压测,然后看看火焰图,性能之类的。
njs只有一个content阶段,为啥没设计rewrite/access等阶段?
Lua和javascript脚本的局限性
Lua和javascript有个缺点:不支持64bit。如果处理64bit ID号,一般采用字符串形式。