专栏名称: 全栈修仙之路
专注分享 TS、Vue3、前端架构和源码解析等技术干货。
目录
相关文章推荐
哔哩哔哩  ·  巨额花销,去国外旅拍婚纱照值吗? ·  21 小时前  
哔哩哔哩  ·  15万人口的小县城,办了一场最纯粹的漫展 ·  21 小时前  
哔哩哔哩  ·  懒人攻略:一周食材怎么储存 ·  昨天  
哔哩哔哩  ·  新晋百亿影帝小哪吒,要被UP主玩坏了 ·  昨天  
51好读  ›  专栏  ›  全栈修仙之路

Nginx 也能运行 JS 代码了!

全栈修仙之路  · 公众号  ·  · 2024-11-18 18:27

正文

前言

在编程世界里, JavaScript 以其无与伦比的灵活性和广泛的应用场景而闻名。

前端 后端 ,从 桌面 移动 设备,JavaScript 的身影无处不在。但你有没有想过,JavaScript 竟然也能在 Nginx 中大展身手?

没错,今天,我们就来聊聊如何用 JavaScript 扩展 Nginx 的功能,探索 njs Nginx JavaScript Engine )的奥秘。

什么是 njs?

njs JavaScript 语言的子集,允许我们在 Nginx 中直接运行 JavaScript 代码,从而扩展 Nginx 的功能。

它基于 ECMAScript 5.1(严格模式)创建,并兼容一些 ECMAScript 6 及更高版本的新特性。这意味着,你可以用熟悉的 JavaScript 语法来编写 Nginx 模块,实现复杂的 访问控制 安全检查 响应头操作 等功能。

Next.js 搭配 Headless CMS 搞网站真香!

njs 的用武之地

njs 的用例非常广泛,以下是一些常见的应用场景:

  1. 复杂的访问控制和安全检查 :在请求到达上游服务器之前,使用 njs 进行细粒度的控制和检查。
  2. 操作响应标头 :灵活地修改 HTTP 响应头,以满足特定的业务需求。
  3. 异步内容处理程序和过滤器 :编写异步的内容处理逻辑,提高 Nginx 的处理能力。

基本 HTTP 示例

让我们通过一个简单的示例来感受 njs 的魅力。以下是一个基本的 HTTP 示例,展示了如何在 Nginx 中使用 njs 来返回一个简单的 "Hello world!" 响应。

njs 脚本(http.js)

function hello(r{
    r.return(200"Hello world!");
}

export default {hello};

Nginx 配置

load_module modules/ngx_http_js_module.so;

events {}

http {
    js_import http.js;

    server {
        listen 8000;

        location / {
            js_content http.hello;
        }
    }
}

通过上述配置,当访问 Nginx 的根目录时,njs 脚本将被触发,并返回 "Hello world!" 的响应。

njs 的高级功能

njs 不仅能处理基本的 HTTP 请求和响应,它还提供了一系列的高级功能,包括 文件系统 操作、 异步处理 共享内存 等。

文件系统操作

njs 提供了对文件系统的访问能力,使得在 Nginx 中进行文件操作成为可能。以下是一些常用的 文件系统 操作函数:

  • access() :检查文件的访问权限。
  • open() :打开文件,支持同步和异步操作。
  • readdir() :读取目录内容。
  • realpath() :将相对路径转换为绝对路径。
  • rename() :重命名文件或目录。
  • unlink() :删除文件。
  • rmdir() :删除目录,支持递归删除。
  • stat() :获取文件状态信息。
  • symlink() :创建符号链接。

异步处理

njs 支持 异步操作 ,这对于处理 I/O 密集型任务非常有用,因为它不会阻塞 Nginx 的事件循环。

function asyncExample(r{
    // 异步读取文件
    fs.promises.access('/path/to/file', fs.constants.R_OK).then(() => {
        r.return(200'File is accessible');
    }).catch(() => {
        r.return(403'File is not accessible');
    });
}

export default { asyncExample };

共享内存

njs 提供了 共享内存 的功能,允许多个 Nginx 工作进程之间共享数据。

// 设置共享内存区
function setSharedData(r{
    const shared = ngx.shared.my_shared_zone;
    shared.set('key''value');
    r.return(200'Data set in shared memory');
}

// 获取共享内存区的数据
function getSharedData(r{
    const shared = ngx.shared.my_shared_zone;
    const value = shared.get('key');
    r.return(200, value || 'No data found');
}

export default { setSharedData, getSharedData };

响应客户端

njs 提供了多种方式来 响应 客户端请求。

function






请到「今天看啥」查看全文