这篇文章主要为大家展示了“如何利用njs模块在Nginx配置中引入js脚本”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何利用njs模块在nginx配置中引入js脚本”这篇文章吧。一 安装 N
这篇文章主要为大家展示了“如何利用njs模块在Nginx配置中引入js脚本”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何利用njs模块在nginx配置中引入js脚本”这篇文章吧。
要求 nginx 的版本大于 1.9.11, 因为从该版本才开始支持 load_module 指令
注意: 不同版本的 nginx 需要相应版本的 NJS 模块.
将 ngx_Http_js_module.so 文件放在nginx 根目录的 modules 目录下,
在 nginx.conf 中增加引入模块
load_module modules/ngx_http_js_module.so;load_module modules/ngx_stream_js_module.so;
下载源码 https://hg.nginx.org/njs/?_ga=2.99259804.301589667.1638621670-451035464.1638621670
该仓库在mercurial中管理, 需要使用 hg 命令下载源码
hg clone http://hg.nginx.org/njs
nginx 编译时增加如下配置
./configure --add-module=<path to njs>/njs/nginx
NJS 模块并不是运行一个 nodejs, 因此 nginx js 只能像 lua 模块一样作为 nginx 的一个中间件, 无法独立作为一个完整的后台服务.
与前端同学熟悉的 node 或浏览器中运行环境不同. njs 并没有使用 v8 解析引擎, nginx 官方基于 ECMAScript 语言规范定制了一个解析引擎. 因此支持的语法和特性也与标准有所不同.
每次请求时创建运行时环境, 请求结束时销毁
node 运行时启动的虚拟机是常驻内存的, 且该虚拟机运行时会自动完成内存的垃圾回收.
而 NJS 会在每次请求时创建一个新的虚拟机并分配内存, 在请求结束时销毁该虚拟机并释放内存.
非阻塞代码执行
njs 采用事件驱动模型对 NJS 运行时环境进行调度。当 NJS 执行阻塞操作(例如读取网络数据或发出外部子请求)时,Nginx 会挂起当前 NJS VM 的执行,并在事件完成时重新调度。因此 NJS 的代码可以以简单的线性方式来写
只支持部分 ECAMA 规范的语法
NJS 基于ECMAScript 5.1 规范, 并支持 ECMAScript 6 中的部分函数
支持的语法列表 https://nginx.org/en/docs/NJS/compatibility.html?_ga=2.91935000.301589667.1638621670-451035464.1638621670
集成请求处理过程
Nginx 对请求的处理包含多个阶段. Nginx的指令通常在某个指定的阶运行对请求进行处理. Nginx 的模块也正是利用这个能力, 来调试或修改一个请求.
NJS 模块也是通过指令的形式, 实现在特定的阶段运行 js 代码逻辑.
处理阶段 | HTTP 模块 | Stream 模块 |
---|---|---|
Access – Authentication and access control | auth_request and js_content | js_access |
Pre-read – Read/write payload | N/A | js_preread |
Filter – Read/write response during proxy | js_body_filter js_header_filter | js_filter |
Content – Send response to client | js_content | N/A |
Log / Variables – Evaluated on demand | js_set | js_set |
以下示例用 js 定义一种 log 的格式
在 Nginx 配置目录下创建一个 logging.js 文件
// 文件位置: [nginx根目录]/conf/logging.js// 文件内容: 解析请求, 打印出所有的请求头function logAllHeaders(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 { logAllHeaders }
# nginx 的配置文件http { js_import logging.js; # js_import 加载一个 js 脚本, 该文件放在nginx 配置文件的目录下. js 的文件名会作为该模块的命名空间. 引用函数时可以通过[文件名].[函数名]的方式来引用 js_set $log_all_headers logging.logAllHeaders; # js_set 把js文件中的函数 logAllHeaders 的输出保存到变量 $log_all_headers. log_fORMat kvpairs $log_all_headers; # 自定义一种日志格式 kvpairs server { listen 80; access_log /var/log/nginx/access.log kvpairs; # 设置该规则下的日志格式为上面自定义的格式 root /usr/share/nginx/html; }}
参考文档
NJS 支持的指令并不多. 要实现复杂的功能需要与 Nginx 的其他指令结合一起使用.
以下介绍几个常用的指令
js_body_filter 修改 response 的 body
Syntax:js_body_filter function | module.function [buffer_type=string | buffer];Default:—Context:location, limit_exceptThis directive appeared in version 0.5.2.
示例
function filter(r, data, flags) { r.sendBuffer(data.toLowerCase(), flags);}
js_content 处理请求的返回
Syntax:js_content function | module.function;Default:—Context:location, limit_except
示例
http { # 引入 js 模块 js_import http.js; server { listen 80; location /content { # 通过 js_content 指令指定要执行的 js 函数 js_content http.content; } }}
// http.js 文件function content(r) { r.status = 200; r.headersOut['Content-Type'] = "text/plain; charset=utf-8"; r.headersOut['Content-Length'] = 12; r.sendHeader(); r.send("I am content"); r.finish()}export default { content }
js_header_filter 修改返回的请求头
Syntax:js_header_filter function | module.function;Default:—Context:location, limit_exceptThis directive appeared in version 0.5.1.
js_import 导入一个 js 文件
Syntax:js_import module.js | export_name from module.js;Default:—Context:httpThis directive appeared in version 0.4.0.
示例
http { # 引入 js 模块. 文件名会作为该模块的命名空间. 引用函数时可以通过[文件名].[函数名]的方式来引用 js_import http.js; server { listen 80; location /content { # 通过 js_content 指令指定要执行的 js 函数 js_content http.content; } }}
js_set 设置变量
Syntax:js_set $variable function | module.function;Default:—Context:http
该指令引用的函数会在变量第一次被引用时执行. 并且函数内仅支持同步的操作
以上是“如何利用njs模块在nginx配置中引入js脚本”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!
--结束END--
本文标题: 如何利用njs模块在nginx配置中引入js脚本
本文链接: https://www.lsjlt.com/news/303037.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-04-30
2024-04-30
2024-04-30
2024-04-30
2024-04-30
2024-04-30
2024-04-30
2024-04-30
2024-04-30
2024-04-30
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0