统计Nginx 1小时内访问最多的URL - konakona
konakona
Dream Afar.
konakona

统计Nginx 1小时内访问最多的URL

统计Nginx 1小时内访问最多的URL

要找出最近1小时内访问最多的站点和完整网址,你可以使用Nginx的日志文件来分析访问情况。首先,你需要确保Nginx已经配置为记录访问日志而不是access_log off

通常,Nginx的访问日志位于/var/log/nginx/access.log或类似的位置,具体路径取决于你的Nginx配置。

接下来,你可以使用一些命令行工具和技巧来分析这些日志文件。以下是一种可能的方法:

# 使用grep和awk命令来提取最近1小时内的日志条目
now=$(date +"%Y-%m-%d %H:%M:%S")
one_hour_ago=$(date -d '1 hour ago' +"%Y-%m-%d %H:%M:%S")
grep -E "$one_hour_ago|$now" /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -nr

这个命令会在日志文件中搜索最近1小时内的日志条目,提取出访问的URL(在Nginx日志中通常位于第7列),然后对其进行计数并按访问次数进行降序排序,返回一个包含站点和访问次数的列表。

这些命令假定Nginx的访问日志采用默认格式。如果你的Nginx配置使用了不同的日志格式,就需要相应地调整命令中的字段位置了。


通常,一台Nginx服务器上往往有多个站点( Virtual Host ),我们创建一个analyze_logs.sh脚本来存放要执行的命令以分析这些日志中访问最多的站点和网址:

#!/bin/bash

# 定义日志文件路径
LOG_DIR="/data/wwwlogs/"
# 定义时间间隔(秒)
TIME_INTERVAL=3600

# 获取当前时间戳
CURRENT_TIME=$(date +%s)

# 遍历日志目录下的所有日志文件
for LOG_FILE in "${LOG_DIR}"*_nginx.log; do
  # 获取文件名(站点名称)
  SITE_NAME=$(basename "${LOG_FILE}" _nginx.log)

  # 计算文件的修改时间
  FILE_MOD_TIME=$(stat -c %Y "${LOG_FILE}")

  # 计算时间间隔
  TIME_DIFF=$((CURRENT_TIME - FILE_MOD_TIME))

  # 检查是否在指定时间间隔内
  if [ ${TIME_DIFF} -le ${TIME_INTERVAL} ]; then
    # 输出站点名称
    echo "站点: ${SITE_NAME}"

    # 使用 awk 分析日志文件并统计访问次数最多的前 50 个 URL
    awk '{print $7}' "${LOG_FILE}" | grep -vE '(\.gif|\.jpg|\.jpeg|\.png|\.ico|\.css|\.js)' | sort | uniq -c | sort -nr | head -n 50 | while read COUNT URL; do
      echo "访问次数: ${COUNT}"
      echo "网址: ${URL}"
      echo "======================"
    done

    echo
  fi
done
# 赋执行权限
chmod +x analyze_logs.sh
# 执行脚本
./analyze_logs.sh

这个命令会遍历/data/wwwlogs/目录下的每个日志文件,找到每个站点里访问次数最多的URL,并显示站点名称、最多访问的URL以及访问次数。


接下来我们还可以增加时间条件以便查询出一小时内的访问信息,并且输出成csv格式的纯文本信息方便导入excel查看:

#!/bin/bash

# 获取Nginx日志文件列表
log_files=$(ls /data/wwwlogs/*_nginx.log)

# 获取当前时间的1小时前的时间戳
start_time=$(date -d '1 hour ago' '+%d/%b/%Y:%H:%M:%S')

# 添加标题行
echo "日志名,路径,1小时内访问总数"

# 循环处理日志文件
for log_file in $log_files; do
    # 获取日志文件名
    log_name=$(basename $log_file)

    # 使用awk处理日志文件并输出结果
    awk -v log_name="$log_name" -v start_time="$start_time" '$4 > start_time {urls[$7]++} END {for (url in urls) {print log_name "," url "," urls[url]}}' $log_file
done | sort -t',' -k2 -n -r | head -n 50

这个命令会遍历/data/wwwlogs/目录下的每个日志文件,找到每个站点最近1小时内访问次数最多的URL,并按照标题行约定返回csv格式的纯文本。

https://blog.img.crazyphper.com/2023/09/截屏2023-09-06-14.29.28-800x593.png

大功告成,感谢阅读与支持! ?

赞赏

团哥

文章作者

继续玩我的CODE,让别人说去。 低调,就是这么自信。

konakona

统计Nginx 1小时内访问最多的URL
要找出最近1小时内访问最多的站点和完整网址,你可以使用Nginx的日志文件来分析访问情况。首先,你需要确保Nginx已经配置为记录访问日志而不是access_log off。 通常,Nginx的访问日志…
扫描二维码继续阅读
2023-09-06