带有会话存储的 NGINX JavaScript 模块(如 Redis)

Rus*_*der 7 javascript nginx redis

我知道可以在 NGINX 服务器内部通过 JS 脚本处理每个请求。

我知道有 Lua Nginx 模块和 Lua Redis 驱动程序,并且可以在 Lua 中编写脚本并直接从 NGINX 服务器使用 Redis。

但是,我想使用 NGINX 的标准功能,我更喜欢用 JS 编写代码。我想知道 NJS 是否可以使用一些会话存储?以及怎么做?特别是,我想使用 Redis 作为会话存储。

Jul*_*kov 4

如果避免自己为 Nginx 编译和安装第三方模块,我认为使用 njs 和 Redis 构建会话存储的最佳方法是利用内置的ngx_http_upstream_module模块并设置类似的东西

http {
    [...]

    upstream redis {
        server unix:/var/run/redis/nginx.sock;
    }

    [...]

    js_path conf.d/js/;

    js_import redismiddleware.js;

    [...]

    server {
        [...]

        location /redisadapter {
            internal;

            try_files @dummy @redis;
        }

        location /request-we-are-tracking-no-1/ {
            js_content redismiddleware.processRequestConditional;
        }

        [...]

        location /request-we-are-tracking-no-2/ {
            js_content redismiddleware.processRequestUnconditional;
        }

        [...]
    }
Run Code Online (Sandbox Code Playgroud)

以及相应的脚本

http {
    [...]

    upstream redis {
        server unix:/var/run/redis/nginx.sock;
    }

    [...]

    js_path conf.d/js/;

    js_import redismiddleware.js;

    [...]

    server {
        [...]

        location /redisadapter {
            internal;

            try_files @dummy @redis;
        }

        location /request-we-are-tracking-no-1/ {
            js_content redismiddleware.processRequestConditional;
        }

        [...]

        location /request-we-are-tracking-no-2/ {
            js_content redismiddleware.processRequestUnconditional;
        }

        [...]
    }
Run Code Online (Sandbox Code Playgroud)

简短的摘要

  1. Redis 正在监听并回复套接字 /var/run/redis/nginx.sock
  2. 虚拟内部位置/redisadapter接收来自 njs 脚本的请求,将它们传输到 Redis 并将回复返回给 njs 方法,该方法启动了请求序列
  3. 为了在某​​个位置与 Redis 建立数据交换,我们控制 Nginx 标准流程并使用自定义 njs 方法维护这些位置
  4. 因此,除了 Redis 相关信息交换例程之外,方法中的代码本身应该实现检索请求的内容并将该内容返回给客户端的完整子例程,因为我们从 Nginx 接手了这项工作
  5. 这是通过从服务器到服务器的本地子请求集来实现的,这对客户端来说是透明的。njs方法完成设置并将请求的内容传递回客户端
  6. 上面的示例包含两个方法,processRequestConditional 和 processRequestUnconditional,目的是展示维护此类任务的最常用的替代逻辑方法
  7. 第一个,processRequestConditional,演示了子请求链 - 即,直到 njs 方法忙于将下一条数据传输到 Redis 会话存储的主要任务之前,才会获取客户端请求的内容。而且,如果脚本对Redis反馈不满意,则根本会跳过对客户端的内容请求,而客户端会面临拒绝消息
  8. 第二种方法processRequestUnconditional,与上面第一种方法相同,将数据传输到Redis存储,但是这次客户端请求的命运不取决于Redis反馈的结果,因此同时发出内容的二次请求与主数据库的时间,并行流动,同时脚本继续与会话存储进行信息交换

当然,我的简短解释留下了很多幕后细节,但我希望现在基本概念已经清楚

请随时提出其他问题