nginx javascript模块持久性

qxsslcnc  于 2022-11-27  发布在  Java
关注(0)|答案(2)|浏览(110)

有没有可能在nginx的javascript模块中持久化一些数据?
我需要保护请求中的一些数据,以验证是否允许以下请求。

ecfsfe2w

ecfsfe2w1#

我会尝试通过写一个文件并阅读它来使用它。https://github.com/nginx/njs/issues/75这里有人正在使用它。第二个想法是尝试将它设置为nginx变量或其他东西。https://www.docs4dev.com/docs/en/nginx/current/reference/http-ngx_http_js_module.html

9w11ddsr

9w11ddsr2#

我建议使用ngx_http_keyval_module,它允许在共享内存中保存键值字典,所有请求和工作者都可以使用。
看一下每个客户端IP的请求数示例。

nginx配置文件

...

http {
  js_path "/etc/nginx/njs/";

  js_import num_requests_module from logging/num_requests_module.js;
  js_set $num_requests num_requests_module.num_requests;

  keyval_zone zone=foo:10m;    
  keyval $remote_addr $foo zone=foo;

  log_format bar '$remote_addr [$time_local] $num_requests';

  access_log logs/access.log bar;

  server {
        listen 80;

        location / {
            return 200;
        }
  }
}

请求模块数.js:

function num_requests(r) {
    var n = r.variables.foo; // read variable from the share memory
    n = n ? Number(n) + 1 : 1;
    r.variables.foo = n; // persist variable in the shared memory
    return n;
}

export default {num_requests};

正在检查:

curl http://localhost/aa; curl http://localhost/aa; curl http://localhost/aa
curl --interface 127.0.0.2 http://localhost/aa; curl --interface 127.0.0.2 http://localhost/aa

docker logs njs_example
127.0.0.1 [22/Nov/2021:16:55:06 +0000] 1
127.0.0.1 [22/Nov/2021:16:55:07 +0000] 2
127.0.0.1 [22/Nov/2021:16:55:29 +0000] 3
127.0.0.2 [22/Nov/2021:18:20:24 +0000] 1
127.0.0.2 [22/Nov/2021:18:20:25 +0000] 2

相关问题