Nginx统计PV、NV

news/2024/9/23 14:33:57/

目录

PV 分析

UV 分析

在 Nginx 的配置文件中设置 access_log 主要涉及到以下几个方面:

以下是一个基本的 access_log 配置示例:

使用命令行工具对日志进行基本分析:

后端记录


对于 nginx 的 access.log 日志,我们可以根据日志信息分析用户行为。比如分析出哪个页面访问次数(PV)最多,访问人数(UV)最多,以及哪天访问量最多,哪个请求访问最多等等。

要分析日志的时候,先用 ls -lh 命令查看日志文件的大小,如果日志文件大小非常大,最好不要在线上环境做。当发现日志很大的时候,我们可以使用 scp 命令将文件传输到闲置的服务器再分析

对于大文件,我们应该养成好习惯,用 less 命令去读文件里的内容,而不是直接用 cat 来查看文件内容。想看日志最新部分的内容,可以使用 tail 命令。想实时看日志打印的内容,你可以使用 tail -f 命令。

  • PV 分析

PV 的全称叫 Page View,用户访问一个页面就是一次 PV,比如大多数博客平台,点击一次页面,阅读量就加 1,所以说 PV 的数量并不代表真实的用户数量,只是个点击量。对于 nginx 的 acess.log 日志文件来说,直接使用 wc -l 命令,就可以查看整体的 PV 了。

按时间分组,首先我们先「访问时间」过滤出来,这里可以使用 awk 命令来处理,awk 是一个处理文本的利器。awk 命令默认是以「空格」为分隔符,由于访问时间在日志里的第 4 列,因此可以使用 awk '{print $4}' access.log 命令把访问时间的信息过滤出来。如果只想显示年月日的信息,可以使用 awk 的 substr 函数,可以使用 sort 对日期进行排序,然后使用 uniq -c 进行统计,于是按天分组的 PV 就出来了。使用 uniq -c 命令前,先要进行 sort 排序

  • UV 分析

UV 的全称是 Uniq Visitor,它代表访问人数,比如公众号的阅读量就是以 UV 统计的,不管单个用户点击了多少次,最终只算 1 次阅读量。可以用「客户端 IP 地址」来近似统计 UV

这里同样,可以按天分组分析,如下命令:相当于把「日期 + IP地址」过滤出来,并去重


按天统计UV

如果需要对当天的 UV 统计,在上面的命令再拼接 awk '{uv[$1]++;next}END{for (ip in uv) print ip, uv[ip]}' 命令就可以了。

  • 终端分析

nginx 的 access.log 日志最末尾关于 User Agent 的信息,主要是客户端访问服务器使用的工具,可能是手机、浏览器等。User Agent 的信息在日志里的第 12 列,因此我们先使用 awk 过滤出第 12 列的内容后,进行 sort 排序,再用 uniq -c 去重并统计,最后再使用 sort -rn(r 表示逆向排序, n 表示按数值排序) 对统计的结果排序

  • 分析 TOP3 的请求

access.log 日志中,第 7 列是客户端请求的路径,先使用 awk 过滤出第 7 列的内容后,进行 sort 排序,再用 uniq -c 去重并统计,然后再使用 sort -rn 对统计的结果排序,最后使用 head -n 3 分析 TOP3 的请求。

在 Nginx 的配置文件中设置 access_log 主要涉及到以下几个方面:

  1. 日志文件的路径:指定日志文件存放的位置。

  2. 日志格式:定义日志记录的格式,包括时间戳、请求方法、请求资源、状态码等。

  3. 日志级别:可选,设置日志记录的详细程度。

  4. 日志缓冲:可选,设置日志写入的缓冲机制。

  5. 日志旋转:可选,设置日志文件的旋转策略,例如按大小或时间自动分割日志文件。

以下是一个基本的 access_log 配置示例:

http {# 定义日志格式log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent"';# 指定日志文件的路径和使用的格式access_log /var/log/nginx/access.log main;# 可选:设置日志缓冲区大小# access_log /var/log/nginx/access.log main buffer=16k;# 可选:设置日志文件的旋转策略# access_log /var/log/nginx/access.log main if=$loggable;
}

在这个示例中:

  • log_format 指令定义了日志的格式,这里定义了一个名为 main 的日志格式。
  • access_log 指令指定了日志文件的路径和使用的日志格式。这里使用了上面定义的 main 格式。
  • buffer 选项可以设置日志缓冲区的大小,这有助于减少磁盘I/O操作。
  • if 选项可以用来指定条件,只有当条件满足时,请求才会被记录到日志中。例如,if=$loggable 可以用于记录特定条件下的日志。

请注意,你需要根据你的实际需求来调整这些配置。例如,如果你使用的是 CDN 或代理服务器,可能需要记录原始客户端的 IP 地址,这可以通过 $http_x_forwarded_for 变量来实现。此外,确保日志文件的路径是存在的,并且 Nginx 进程有权限写入该路径。

使用命令行工具对日志进行基本分析:

# 假设日志文件路径为 /var/log/nginx/access.log# 查看访问量最多的页面(PV)
cat /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -nr | head -10# 查看访问人数(UV),这里假设使用客户端IP作为用户的唯一标识
cat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10# 查看访问量最多的请求,这里使用请求方法和资源
cat /var/log/nginx/access.log | awk '{print $6 " " $7}' | sort | uniq -c | sort -nr | head -10# 查看访问量最多的一天
cat /var/log/nginx/access.log | awk '{print $4}' | sort | uniq -c | sort -nr | head -1# 以上命令仅为示例,实际分析时可能需要根据具体的日志格式和需求进行调整。

后端记录

访问人数(Unique Visitors, UV)和访问页面(Page Views, PV)通常涉及到更复杂的数据处理和存储机制。以下是一些常见的方法:

  1. 使用数据库

    • 将每次用户访问的信息存储到数据库中。对于UV,可以使用用户的唯一标识(如IP地址、注册用户ID等)来区分不同的访问者。对于PV,可以记录每次页面请求。
  2. 使用缓存系统

    • 利用Redis等内存数据结构存储系统,可以快速地记录和查询UV和PV。例如,使用Redis的集合(Set)来存储UV,使用哈希表(Hash)或字符串(String)来记录PV。
  3. 使用日志分析工具

    • 使用如ELK Stack(Elasticsearch, Logstash, Kibana)、Graylog、Fluentd等日志分析和可视化工具,可以对日志数据进行实时或批量处理,提取UV和PV等统计信息。
  4. 使用Web分析服务

    • 集成Google Analytics、Mixpanel等第三方Web分析服务,它们可以提供详细的访问统计和用户行为分析。
  5. 编写后端脚本

    • 在后端应用中编写脚本或逻辑,用于处理和记录访问数据。例如,在用户访问页面时,更新数据库或缓存中的计数器。
  6. 使用消息队列

    • 将访问事件发送到消息队列(如RabbitMQ、Kafka等),然后通过消费者服务对事件进行处理,更新UV和PV的计数。
  7. 使用云服务

    • 利用云服务提供商的分析工具,如AWS CloudWatch、Google Cloud Monitoring等,它们可以收集和分析应用的访问数据。

以下是一个简单的后端记录UV和PV的示例逻辑:

# 假设使用Python和Flask作为后端框架,使用Redis作为缓存系统from flask import Flask, request
import redisapp = Flask(__name__)
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)@app.route('/')
def index():# 记录PVpage_views_key = 'page_views:index'redis_client.incr(page_views_key)# 记录UVunique_visitors_key = 'unique_visitors:index'visitor_id = request.remote_addr  # 使用IP地址作为示例,实际可能需要更复杂的用户标识redis_client.sadd(unique_visitors_key, visitor_id)return "Welcome to the homepage!"if __name__ == '__main__':app.run()

在这个示例中,每次用户访问首页时,都会在Redis中增加PV的计数,并记录UV。这只是一个简单的例子,实际应用中可能需要考虑更多的因素,如用户会话管理、数据持久化、并发处理等。


http://www.ppmy.cn/news/1505680.html

相关文章

STM32——外部中断(EXTI)

目录 前言 一、外部中断基础知识 二、使用步骤 三、固件库实现 四、STM32CubeMX实现 总结 前言 外部中断(External Interrupt,简称EXTI)是微控制器用于响应外部事件的一种方式,当外部事件发生时(如按键按下、传感器信号…

请转告HPC计算AI计算单位,选对存储事半功倍

U.2 NVMe全闪混合统一存储GS 5000U是Infortrend产品中一款高性能机型。得益于搭载强劲的第五代IntelXeon处理器,以及支持PCIe 5.0、NVMe-oF、100GbE等多种特点,GS 5000U单台块级性能可达50 GB/s的读、20 GB/s的写,以及1300K的IOPS&#xff1b…

kafka 消费者注册过程

在Kafka中,消费者需要找到组协调器(Group Coordinator)来加入消费者组并进行分区分配。查找组协调器的过程如下: 1. 初始化消费者: 创建KafkaConsumer实例并加载配置参数。 2. 发送FindCoordinator请求:…

React18+Vite+Eectron从入门到实战系列之一环境安装篇

如果我们的技术栈是react,也想要用electron来开发一个桌面的多端应用该怎么做呢?这篇文章选择了react的技术栈,讲解了环境的初始化步骤 实现效果 步骤 创建 react 项目 npm create vitelatest my-react-app安装依赖 cd my-react-app npm i…

ClickHouse:单机安装

目录 一、ClickHouse介绍 二、安装ClickHouse 2.1安装要求 2.2单机安装 2.3修改配置文件(可选) 2.4升级软件 三、使用ClickHouse 3.1连接ClickHouse 3.2 执行SQL 一、ClickHouse介绍 ClickHouse是由Yandex开源的一个高性能、面向列的SQL数据库管理系统(DBM…

LearnOpenGL-光照章节学习笔记

LearnOpenGL-光照章节学习笔记 颜色创建一个光照场景 基础光照一、环境光照二、漫反射光照三、镜面反射 材质光照贴图一、漫反射贴图二、镜面光贴图三、放射光贴图 投光物一、平行光二、点光源衰减实现 三、聚光灯平滑边缘 多光源一、平行光(定向光)二、…

成品油流通智慧监管平台:项目实施案例全流程解析,平台架构与功能模块

随着全球能源市场的不断发展与变化,成品油作为重要的能源资源,其流通领域的监管显得尤为重要。然而,传统监管方式在面对复杂多变的市场环境和繁重的监管任务时显得力不从心。 为了提升监管效率,保障市场秩序,某市率先实…

mongotemplate 对Bigdecimal汇总相加

如下面代码&#xff0c;需要对mongo集合中的price汇总相加&#xff0c;price是Bigdecimal类型&#xff0c;在mongodb中是以字符串的形式存储的&#xff08;"price" : "1.500000"&#xff09;&#xff1a; List<AggregationOperation> operations ne…