Nginx统计PV、NV

news2024/11/14 15:06:08

目录

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 redis

app = Flask(__name__)
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)

@app.route('/')
def index():
    # 记录PV
    page_views_key = 'page_views:index'
    redis_client.incr(page_views_key)
    
    # 记录UV
    unique_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.coloradmin.cn/o/1990524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进程的等待(非阻塞轮询+阻塞)和替换控制详解

引言 在Linux系统中,进程管理是核心功能之一。理解进程的创建、执行和终止是系统编程中的基础。本文将深入探讨Linux中的进程控制机制,包括进程的生命周期、父子进程的交互、以及进程状态的管理 1. 进程创建:fork()函数 在Linux操作系统中…

Prompt万能框架与常用评估指标

引言 在人工智能的飞速发展中,大型语言模型(LLM)已成为研究和应用的热点。LLM以其强大的语言理解和生成能力,在诸如自然语言处理、文本生成、问答系统等多个领域展现出巨大潜力。然而,要充分发挥LLM的能力&#xff0c…

NSSCTF练习记录:[SWPUCTF 2021 新生赛]caidao

题目: 图片上给出了代码,是php的一句话木马 eval($_POST[wllm]);符号 符号表示后面的语句即使执行错误,也不报错。 eval()函数 eval()函数的作用是把括号内的字符串全部当作php代码来执行。 ** P O S T [ ′ w l l m ′ ] ∗ ∗ p o s t …

一起学习LeetCode热题100道(30/100)

30.两两交换链表中的节点(学习) 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head …

【LVS】调度算法概念

fd相当于静态 ovf相当于动态

界面控件DevExpress WinForms,支持HTML CSS提升用户体验(二)

DevExpress WinForms现在可以利用HTML/CSS强大的功能,帮助受DevExpress驱动的WinForms应用程序引入现代的UI元素和用户体验! P.S:DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。Dev…

室内定位导航技术:蓝牙信号强度(RSSI)与三角定位算法应用

在数字化时代,位置服务已成为连接物理世界与数字世界的桥梁。在室内环境中,由于GPS信号受建筑物遮挡而失效,传统的室外定位技术难以满足需求,无法精准指引我们在商场、机场、医院等庞大而复杂的建筑内部寻路。室内定位导航技术不仅…

在 Manim 中,kwargs 传递的关键字参数

在 Manim 中,kwargs 用于传递关键字参数,常用于构造对象时。这里的关键参数有那些。我都要,给我整理一下 Sider Fusion 在 Manim 中,kwargs 允许您传递可选的关键字参数来控制动画、对象的外观和行为。尽管具体可用的参数会因对象…

【开端】通过Java 过滤器灵活配置URL访问权限,并返回403

一、绪论 在JAVA项目系统中,后端给前端提供接口。但是在某些场景我们需要临时控制接口是否能被访问。或关闭某一接口的访问权限。 比如某一接口被攻击了或者某一接口存在漏洞,在系统不关闭的情况下,如何控制系统的访问权限。 二、控制接口访…

CVE-2017-15715~Apache解析漏洞【春秋云境靶场渗透】

Apache解析漏洞 漏洞原理 # Apache HTTPD 支持一个文件拥有多个后缀,并为不同后缀执行不同的指令。比如如下配置文件: AddType text/html .html AddLanguage zh-CN .cn# 其给 .html 后缀增加了 media-type ,值为 text/html ;给 …

【案例35】销售订单公式问题导致系统宕机

问题现象 经过顾问反馈,发现系统现在出现卡顿,NCC一直在转圈。 问题分析 远程排查,发现在服务器从机上defalut-7发生了内存溢出,宕机。 生成了宕机日志。分析结果如下: 销售订单相关操作,vo太多了导致…

Java stream流支持多字段排序

背景 对于排序而言,比较常见的场景是前端传递所需的排序字段名和排序方向,然后通过stream流或者数据库来实现排序. 为动态接收参数,继承Map来支持多字段传入.另外stream流原生的sorted写起来相对比较繁琐,通过compartor方法封装构建多字段排序的逻辑.具体就是通过反射拿到对应…

怎么在 React Native 应用中处理深度链接?

深度链接是一种技术,其中给定的 URL 或资源用于在移动设备上打开特定页面或屏幕。因此,深度链接可以引导用户到应用程序内的特定屏幕,而不仅仅是启动移动设备上的应用程序,从而提供更好的用户体验。这个特定的屏幕可能位于一系列层…

docker 好用的加速器

cd /etc/docker vi daemon.json { "registry-mirrors":["https://docker.rainbond.cc"] }

SpringIOC整合dbUtil做的增删改查以及转账业务的实现

目录 一、xml方式实现 1.介绍lombok插件 2.功能 3.步骤 3.1 idea安装插件(只做一次) 3.2 添加坐标 3.3 编写注解 4.核心类 4.1 QueryRunner 4.2 query() 查询 4.3 update() 增删改 5.配置文件applicationContext.xml 6.junit测试 6.1使用步骤 6.1.1 坐标 6.1.2…

【Material-UI】Button Group 中的 Disabled Elevation 功能

文章目录 一、Button Group 组件概述二、什么是 Elevation?三、为什么需要禁用 Elevation?四、使用 disableElevation 属性五、属性解析1. disableElevation 属性2. variant 属性3. aria-label 属性 六、应用场景1. 表单操作2. 工具栏3. 导航按钮 七、样…

vue中v-html 后端返回html + script js中click事件不生效

效果图&#xff1a; 需求&#xff1a;点击加号执行后端返回的script中的代码 后端返回的html&#xff1a; <!DOCTYPE html> <html langzh> <head> <title>xxx</title> <style>body{font-size: 14px}p{text-indent: 30px;}textarea{width…

PythonStudio 控件使用常用方式(十三)TScrollBox

PythonStudio是一个极强的开发Python的IDE工具&#xff0c;它使用的是Delphi的控件&#xff0c;常用的内容是与Delphi一致的。但是相关文档并一定完整。现在我试试能否逐步把它的控件常用用法写一点点&#xff0c;也作为PythonStudio的参考。 从1.2.1版开始&#xff0c;Python…

(Qt) QThread 信号槽所在线程

文章目录 &#x1f481;&#x1f3fb;前言&#x1f481;&#x1f3fb;Code&#x1f481;&#x1f3fb;‍♂️Code&#x1f481;&#x1f3fb;‍♂️环境 &#x1f481;&#x1f3fb;当前线程信号&#x1f481;&#x1f3fb;‍♂️默认效果&#x1f481;&#x1f3fb;‍♂️Qt::…

RTOS(7)队列

1.队列的理论知识 下面的结构体里包含了&#xff1a;头部指针&#xff0c;写指针&#xff0c;读指针&#xff0c;长度&#xff0c;项目大小&#xff0c;两个链表&#xff1b; 写队列的时候&#xff0c;写指针指向头部&#xff0c;写进去之后&#xff0c;itemsize&#xff0c;移…