目录
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
主要涉及到以下几个方面:
-
日志文件的路径:指定日志文件存放的位置。
-
日志格式:定义日志记录的格式,包括时间戳、请求方法、请求资源、状态码等。
-
日志级别:可选,设置日志记录的详细程度。
-
日志缓冲:可选,设置日志写入的缓冲机制。
-
日志旋转:可选,设置日志文件的旋转策略,例如按大小或时间自动分割日志文件。
以下是一个基本的 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)通常涉及到更复杂的数据处理和存储机制。以下是一些常见的方法:
-
使用数据库:
- 将每次用户访问的信息存储到数据库中。对于UV,可以使用用户的唯一标识(如IP地址、注册用户ID等)来区分不同的访问者。对于PV,可以记录每次页面请求。
-
使用缓存系统:
- 利用Redis等内存数据结构存储系统,可以快速地记录和查询UV和PV。例如,使用Redis的集合(Set)来存储UV,使用哈希表(Hash)或字符串(String)来记录PV。
-
使用日志分析工具:
- 使用如ELK Stack(Elasticsearch, Logstash, Kibana)、Graylog、Fluentd等日志分析和可视化工具,可以对日志数据进行实时或批量处理,提取UV和PV等统计信息。
-
使用Web分析服务:
- 集成Google Analytics、Mixpanel等第三方Web分析服务,它们可以提供详细的访问统计和用户行为分析。
-
编写后端脚本:
- 在后端应用中编写脚本或逻辑,用于处理和记录访问数据。例如,在用户访问页面时,更新数据库或缓存中的计数器。
-
使用消息队列:
- 将访问事件发送到消息队列(如RabbitMQ、Kafka等),然后通过消费者服务对事件进行处理,更新UV和PV的计数。
-
使用云服务:
- 利用云服务提供商的分析工具,如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。这只是一个简单的例子,实际应用中可能需要考虑更多的因素,如用户会话管理、数据持久化、并发处理等。