Nginx统计PV、NV

目录

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。这只是一个简单的例子,实际应用中可能需要考虑更多的因素,如用户会话管理、数据持久化、并发处理等。

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值