返回

Nginx访问日志PV和UV统计的实现

前端

Nginx访问日志PV和UV统计的实现

前言

随着互联网的快速发展,网站流量统计已经成为网站运营中必不可少的一环。PV(Page View)和UV(Unique Visitor)是两个最常用的流量统计指标,PV表示页面浏览量,UV表示独立访客数。

实现思路

使用Nginx访问日志统计PV和UV的基本思路如下:

  1. 前端生成uuid,并将其作为请求参数传递给后端。
  2. Nginx精确匹配上报请求,并按照指定格式生成日志。
  3. 定时任务切割日志文件。
  4. 使用Nodejs脚本分析日志,统计PV、UV。

前端生成uuid

前端可以使用JavaScript代码生成uuid,并将其作为请求参数传递给后端。例如,可以使用以下代码生成uuid:

function generateUuid() {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
    var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
    return v.toString(16);
  });
}

Nginx精确匹配上报请求

Nginx可以通过精确匹配上报请求来生成日志。例如,可以使用以下配置来匹配上报请求:

location /report {
  # 精确匹配上报请求
  if ($request_uri = /report) {
    # 生成日志
    access_log /var/log/nginx/report.log combined;
  }
}

按照指定格式生成日志

Nginx可以按照指定格式生成日志。例如,可以使用以下配置来按照指定格式生成日志:

access_log /var/log/nginx/access.log combined;

# 自定义日志格式
log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
                 '$status $body_bytes_sent "$http_referer" '
                 '"$http_user_agent" "$uuid"';

定时任务切割日志文件

可以使用定时任务来切割日志文件。例如,可以使用以下命令来切割日志文件:

# 每天凌晨1点切割日志文件
find /var/log/nginx/access.log -mtime +1 -exec mv {} /var/log/nginx/access.log.$(date +%Y%m%d) \;

使用Nodejs脚本分析日志

可以使用Nodejs脚本来分析日志,统计PV、UV。例如,可以使用以下脚本来统计PV、UV:

const fs = require('fs');
const path = require('path');

// 日志文件路径
const logFile = '/var/log/nginx/access.log';

// 读取日志文件
const data = fs.readFileSync(logFile, 'utf8');

// 按行分割日志文件
const lines = data.split('\n');

// 统计PV和UV
let pv = 0;
let uv = 0;
const uuidSet = new Set();

for (const line of lines) {
  // 跳过空行
  if (!line) {
    continue;
  }

  // 解析日志行
  const parts = line.split(' ');
  const uuid = parts[10];

  // 统计PV
  pv++;

  // 统计UV
  if (!uuidSet.has(uuid)) {
    uv++;
    uuidSet.add(uuid);
  }
}

// 输出统计结果
console.log(`PV: ${pv}`);
console.log(`UV: ${uv}`);

结语

本文介绍了一种使用Nginx访问日志统计PV和UV的实践。这种方法简单易行,可以帮助网站运营者快速统计出网站的PV和UV。