LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

nginx内置js模块实现访问量统计

admin
2025年8月23日 22:53 本文热度 21

一、统计实现

js 统计访问量,utils.js:

/**
 * 查询访问总量
 */
function getNum(key) {
   let num = ngx.shared.num.get(key);
   return num ?? 0;
}
/**
 * 记录访问量
 */
function record(r, data, flags) {
 // 在最后一个数据块时增加一次请求数量
 if (flags && flags.last) {
    let key = "request_num";
    let num = getNum(key);
    num++;
    // 保存到共享内存中
    ngx.shared.num.set(key, num);
  }
  r.sendBuffer(data, flags);
}

function query(r) {
  return getNum("request_num");
}

export default { record, query };

nginx 配置:

http {
    设置一块共享内存区域,用于保存请求数量
    js_shared_dict_zone zone=num:512K type=number state=/var/nginx/num.json;
    # js文件路径
    js_path "/usr/local/nginx/njs";
    # 导入js统计模块
    js_import utils.js;


    server {
        listen 89;
        server_name localhost;

        location / {
            记录请求数,其它需要统计访问量的location相同配置,js_body_filter指令不能配置中http中
            js_body_filter utils.record;
            root html;
            index index.html index.htm;
        }

        location /stat {
            default_type text/plain;
            charset utf-8;

            统计接口/stat的访问没有计算到访问总量中
            js_body_filter utils.record;

            获取请求数总量
            js_set $request_num utils.query;
            return 200 "总请求量:$request_num";
        }
    }
}

二、测试

  1. 安装压测工具, sudo yum install httpd-tools

  2. 发送 200 个请求, ab -n 200 -c 5 http://localhost:89/

  3. 接口查看访问量, curl http://localhost:89/stat, 返回 总请求量:200

  4. 查看 state 文件中的访问量,cat /var/nginx/num.json,返回 {"request_num":{"value":200.000000,"expire":2819531276}}

  5. 重启 nginx 验证,共享数据是否仍然存在,reload 后数据不会丢失,stop 再启动数据丢失。



三、按客户端地址统计访问量

js 方法中记录统计量的 key 改为远程地址

/**
 * 查询访问总量
 */
function getNum(key) {
  let num = ngx.shared.num.get(key);
  return num ?? 0;
}
/**
 * 记录访问量
 */
function record(r, data, flags) {
 // 在最后一个数据块时增加一次请求数量
 if (flags && flags.last) {
    let key = r.variables.remote_addr;
    let num = getNum(key);
    num++;
    // 保存到共享内存中
    ngx.shared.num.set(key, num);
  }
  r.sendBuffer(data, flags);
}

export default { record };

获取统计量,直接返回 state 对应的 json 文件

http {
    js_shared_dict_zone zone=num:512K type=number state=/var/nginx/stat.json;
    js_path "/usr/local/nginx/njs";
    js_import utils.js;


    server {
        listen 89;
        server_name localhost;

        location / {
            # 记录请求数
            js_body_filter utils.record;
            root html;
            index index.html index.htm;
        }

        location /stat {
            default_type application/json;
            charset utf-8;

            alias /var/nginx/;
            try_files stat.json '';
        }
    }
}




四、相关知识

  1. js_shared_dict_zone 指令
    • 设置一块共享内存区域,用于存储 key-value 数据。这些数据可以在不同工作进程间共享。

    • 语法格式为 js_shared_dict_zone zone=name:size [timeout=time] [type=string|number] [evict] [state=file];, 只能配置在 http 块中。

    • key 和 value 的默认数据类型为 string。可以使用 type 参数指定 value 的数据类型为 number:type=number

    • timeout 参数设置共享数据有效期,单位毫秒。

    • evict 参数设置后,如果共享空间用尽将删除最旧的 key-value 数据。

    • state 参数设置一个 json 用于保存数据,以确保 nginx 被重启后数据不会丢失。

  1. js_body_filter 指令
    • 设置一个 js 函数为 http 响应体的过滤函数,对响应的每个数据块调用设定的函数。


阅读原文:原文链接


该文章在 2025/8/25 13:31:23 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved