njs scripting language 是 nginx 官方推出的一个基于 JavaScript 的扩展,类似 ngx_lua (openresty) 模块,启用后可以通过 JS 脚本来扩展 nginx 功能。
njs 只支持部分 JS 语法,但也足以实现自定义鉴权、修改请求&响应、A/B Test、缓存控制、加解密、子请求等网关功能,值得一试。
njs 官网页面链接:https://nginx.org/en/docs/njs/index.html
安装 njs 和安装其他模块一样。
这里介绍编译成动态模块通过 load_module 加载。
1、首先查看当前 nginx 版本。
nginx -v
下载对应版本的 nginx 源码并解压。
2、下载 njs 源码并解压。
3、分别解压,进入 nginx 源码目录。
cd nginx-1.20.2
4、查看和复制当前使用 nginx 编译参数(即 configure arguments: 后面那部分)。
nginx -V
5、配置编译参数。
./configure 刚才复制的编译参数 --add-dynamic-module=njs解压地址/nginx
6、编译。
make modules
7、编译完成后在当前 nginx 源码目录的 objs 目录下会有 njs 的两个模块文件。
ngx_http_js_module.so
ngx_stream_js_module.so
8、复制 so 文件到 nginx 安装目录(即 nginx -V 查看的 --prefix 参数)的 modules 目录下。
9、在 nginx.conf 文件添加代码载入需要的模块。
load_module modules/ngx_http_js_module.so;
10、完成配置,重启 nginx 即可。
1、创建测试文件 /etc/nginx/njs/test.js 写入代码:
function summary(r) {
var a, s, h;
s = "JS summary\n\n<pre>";
s += "Time: " + new Date().toLocaleString() + "\n";
s += "Method: " + r.method + "\n";
s += "HTTP version: " + r.httpVersion + "\n";
s += "Host: " + r.headersIn.host + "\n";
s += "Remote Address: " + r.remoteAddress + "\n";
s += "URI: " + r.uri + "\n";
s += "Headers:\n";
for (h in r.headersIn) {
s += " " + h + ": " + r.headersIn[h] + "\n";
}
s += "Args:\n";
for (a in r.args) {
s += " " + a + ": " + r.args[a] + "\n";
}
s += "\n\n</pre>";
r.return(200, s);
}
function header(r) {
r.headersOut['content-type'] = 'text/html';
}
export default {summary, header};
2、在 nginx.conf http 段添加配置。
js_path '/etc/nginx/njs/';
js_import 'test.js';
server {
listen 8000;
location / {
js_header_filter test.header;
js_content test.summary;
}
}
3、重启 nginx 并打开 http://127.0.0.1:8000/ 即可看到 njs 返回的页面。
使用 njs 边缘脚本可以减轻后端压力,甚至代替鉴权网关,值得一学。
官网: https://nginx.org/en/docs/njs/index.html
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。