要找出最近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格式的纯文本。
大功告成,感谢阅读与支持! ?