前些日子尝试了在 nginx 中写 JavaScript 的效果。考虑到 JavaScript 作为编程语言不是强需求,在nginx生态上还是 lua 独大,并且还有 openresty 这样一直强力输血,大部分应用场景都能找到参考的解决方案。
插件生态来说,github 上 lua-resty-
开头的都是相关的模块,并且也提供了 https://opm.openresty.org/ 这样的搜索站点。njs这块就非常零散。
所以最后仅仅浅尝辄止,将过程稍微记录一下。
介绍 njs
nginx 中要提供编程能力第一想到的是lua,但在2016年nginx官方就已经在尝试将js引入nginx中了。现如今njs模块已经是nginx官方正式模块之一,并且也一直在不断迭代更新中。
官方介绍:
njs is a subset of the JavaScript language that allows extending nginx functionality. njs is created in compliance with ECMAScript 5.1 (strict mode) with some ECMAScript 6 and later extensions. The compliance is still evolving.
njs 是 JavaScript 语言的一个子集,可以扩展 nginx 的功能。njs 是根据 ECMAScript 5.1(严格模式)创建的,其中包含一些 ECMAScript 6 及更高版本的扩展。其合规性仍在不断改进。
安装&编译
官方提供了两种安装方式,作为软件包使用指令加载和从源码编译安装。
这里自己的使用情况,选择从第二种方式。
下载 njs 源码
官方提供的源码仓库是基于 Mercurial 的,在 github 上也有提供源码,地址:https://github.com/nginx/njs。这里需要将整个仓库下载下来,编译需要用到这些文件。
下载 nginx 源码
下载 nginx 源码,配置编译参数。
这里使用的是 tengine,将 tengine 编译成 Docker 镜像。Dockerfile 使用这个 https://github.com/Axizdkr/tengine/blob/master/Dockerfile
配置编译命令
nginx 编译只需要添加模块指定路径,编译时会自动将这份源代码编译进去。
这里在 Dockerfile 的 57 行后添加
--add-module=module/njs/nginx
njs源码使用命令复制到
/usr/src/tengine-$TENGINE_VERSION/module/njs
目录下。我这里将复制语句添加在了81行后。在找资料时,有的文章说要复制编译后的so文件有的说不要,这里测试了一下,在新版njs立不需要复制了。
之后就 docker build 编译镜像就可使用了。
简单使用
语法文档:Module ngx_http_js_module (nginx.org)、Module ngx_stream_js_module (nginx.org)
hello
我们可以在大部分位置使用js,比如我们在 location 中添加:
location / {
js_content hello;
}
nginx 重启没报错提示说明前面编译的njs模块是正常的,访问查看效果。
执行 functioin
也可以直接引入js文件:
js_include http.js;
location / {
js_content version;
}
http.js文件
function version(r) {
r.return(200, njs.version);
}
export default version;
这样就能调用到js中的函数,还能在函数里使用 ngx.fetch 发请求。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。