在现代 web 开发中,中间件的灵活性和功能性至关重要。通过使用 JavaScript,可以为 NGINX 注入中间件功能,赋予其更强大的能力。
NGINX JavaScript(简称 NJS)是一个动态模块,允许用户通过脚本与 NGINX 的执行模型进行交互。
NJS 模块的功能
使用 NJS 模块,您可以实现以下功能:
- 复杂的访问控制和安全检查 :在请求到达上游服务器之前,可以添加复杂的访问控制和安全检查,以确保系统的安全性。
- 操作响应标头 :灵活地修改响应标头,适应不同的需求和场景。
- 编写异步内容处理程序 :编写灵活的异步内容处理程序、过滤器等,以处理请求和响应。
示例:创建简单的请求拦截器
例如,可以编写一个 hello.js 文件,拦截传入请求并返回一条消息给客户端:
function hello(r) {
r.return(200, "Hello DHub!\n");
}
export default {hello};
要在特定情况下导入 JavaScript 文件并执行函数,您需要在 NGINX 配置中进行如下修改:
http {
js_include hello.js;
server {
location / {
js_content hello.hello;
}
}
}
JavaScript 代码的执行
您可能会好奇,NGINX 是如何执行这段 JavaScript 代码的?
答案是,NGINX 自带一个嵌入式 JavaScript 引擎,经过定制以满足 NGINX 的独特需求。NJS 使用的 JavaScript 是符合 ES5(ECMAScript 5.1 严格变种)的子集,并支持一些 ES6 及更高版本的扩展。
工作机制
NJS 通过允许在 NGINX 配置文件中引入和执行 JavaScript 代码,扩展了 NGINX 的功能。
其工作流程如下:
- 配置加载:在 NGINX 的配置文件中,通过 load_module 指令加载 NJS 模块。
- JavaScript 文件的引入:通过 js_path 指令设置 JavaScript 文件的路径,并使用 js_import 指令引入相应的 JavaScript 文件。
- 函数调用:在处理请求时,使用 js_content 指令调用 JavaScript 中定义的函数,并返回相应的 HTTP 响应。
需要注意的是,您不应期望 NJS 具备 Node.js 类似的功能,也不支持复杂的服务器端代码执行或库功能。此外,NJS 不是要取代 Lua 脚本,Lua 仍然是为 NGINX 编写中间件代码的最流行方式。
NJS 更像是为那些不熟悉 Lua 的开发者提供的替代方案。
安装 NJS
您可以通过从源代码构建 NJS,或更简单地使用软件包形式来安装:
sudo apt install nginx-module-njs
安装完软件包后,您需要使用 load_module 指令加载 NJS 动态模块:
load_module modulesngx_http_js_module.so;
然后,可以像本文开头展示的那样使用这些代码。此外,您也可以参考 NGINX JavaScript 示例,以便更好地入门。
项目地址:
https://github.com/nginx/njs
结论
NJS 为扩展 NGINX 的功能提供了一种更加友好的开发方式。
随着 NGINX 的持续进化,NJS 将为开发者提供更多灵活性与可能性,使中间件的编写变得更简便高效。
通过 NJS,您不仅能够保持 NGINX 的高性能,还能灵活地添加复杂的业务逻辑和处理能力。