浏览 1.5k
原文作者:Liam Crilly of F5
原文链接:借助 NGINX JavaScript 模块,充分利用 JavaScript 的强大功能和便利性以快速处理每个请求 - NGINX
转载来源:NGINX 官方网站
NGINX JavaScript 模块 (njs) 现已作为 NGINX 开源版 1.11.10 和 NGINX Plus R12 中的稳定模块正式推出。[该模块最初称为 nginxScript,一些早期博文中均使用这一名称。] 自 2015 年 9 月 NGINX JavaScript 推出以来,我们一直在稳步推进各项工作,为这一稳定模块添加了不同特性和语言支持。
NGINX JavaScript 模块的用例非常广泛,特别是可同时适用于 HTTP 和 TCP/UDP 协议。NGINX JavaScript 的示例用例包括:
Lua 是一种强大的脚本语言,然而其并未得到广泛采用,而且通常不会出现在前端开发人员或 DevOps 工程师的“技能工具箱”中。
Node.js 使用 Google V8 JavaScript 引擎,而 NGINX JavaScript 则是基于 ECMAScript 标准的定制化实现,专为 NGINX 和 NGINX Plus 而设计。Node.js 在内存中有一个持久化的 JavaScript 虚拟机 (VM),执行日常垃圾回收以管理内存;而 NGINX JavaScript 针对每个请求都会初始化一个新的 JavaScript VM 以及其所需的内存,并在请求完成时释放内存空间。
我们决定实现自己的 JavaScript 运行时,以满足服务器端代码执行的要求,并与 NGINX 的请求处理架构完美契合。我们的 NGINX JavaScript 的设计原则如下:
处理阶段 | HTTP 模块 | Stream 模块 |
---|---|---|
访问 —— 身份验证和访问控制 | auth_request 和 js_content | js_access |
预读 —— 读/写有效载荷 | 不适用 | js_preread |
过滤 —— 代理期间读/写响应 | js_body_filter js_header_filter | js_filter |
内容 —— 向客户端发送响应 | js_content | 不适用 |
日志/变量 —— 按需评估 | js_set | js_set |
在此示例中,我们使用 NGINX 或 NGINX Plus 作为一个简单的反向代理,并采用 NGINX JavaScript 构建特定格式的访问日志的输入条目,这些输入条目:
js_import conf.d/logging.js; # Load JavaScript code from here
js_set $access_log_headers logging.kvAccess; # Fill variable from JS function
log_format kvpairs $access_log_headers; # Define special log format
server {
listen 80;
root /usr/share/nginx/html;
access_log /var/log/nginx/access.log kvpairs;
}
如您所见,NGINX JavaScript 代码并不内嵌在配置语法内。相反,我们使用 js_import 指令来导入包含了所有 JavaScript 代码的文件。js_set 指令定义了一个新的 NGINX 变量 $access_log_headers,以及填充它的 JavaScript 函数。log_format 指令定义了一种名为 kvpairs 的新格式,它能够将 $access_log_headers 的值写入每个日志行。
现在,我们来看看准备日志条目的 JavaScript 代码。
function kvAccess(r) {
var log = `${r.variables.time_iso8601} client=${r.remoteAddress} method=${r.method} uri=${r.uri} status=${r.status}`;
r.rawHeadersIn.forEach(h => log += ` in.${h[0]}=${h[1]}`);
r.rawHeadersOut.forEach(h => log += ` out.${h[0]}=${h[1]}`);
return log;
}
export default { kvAccess }
以下是 NGINX JavaScript 增强型日志记录解决方案实例,我们可通过反向代理传递请求,并观察生成的日志文件条目,其中包括带有 in. 前缀的请求标头及带有 out. 前缀的响应标头。
$ curl http://127.0.0.1/
$ tail --lines=1 /var/log/nginx/access_headers.log
2021-04-23T10:08:15+00:00 client=172.17.0.1 method=GET uri=/index.html status=200 in.Host=localhost:55081 in.User-Agent=curl/7.64.1 in.Accept=*/* out.Content-Type=text/html out.Content-Length=612 out.ETag=\x22606339ef-264\x22 out.Accept-Ranges=bytes
$ sudo apt-get install nginx-module-njs
RedHat、CentOS 和 Oracle Linux 系统
$ sudo yum install nginx-module-njs
load_module modules/ngx_http_js_module.so;
load_module modules/ngx_stream_js_module.so;
$ sudo nginx -s reload
请前往NGINX开源社区:
按点赞数排序
按时间排序