Nginx 日志解析,及 IP 请求量排名统计

更新日期: 2024-09-05 阅读次数: 14365 字数: 419 分类: Nginx

经常遇到服务器被恶意扫描,或者爬取内容的情况,这时候就可以通过统计 Nginx 日志来分析 IP 的来源。

Nginx 日志默认的格式

一条日志

192.34.61.118 - - [15/Jan/2015:16:03:46 +0800] "GET /parse-nginx-log-with-awk.html HTTP/1.1" 200 2148 "http://sunzhongwei.com" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"

对应的格式

$remote_addr - - [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"

统计 nginx 日志中,访问量前 20 的 IP:

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 20

输出结果:

 323146 60.208.116.117
    680 66.249.79.237
    531 66.249.79.238
    494 14.153.218.186
    364 66.249.79.224
    299 27.46.125.110

例如,上面排名第一的 IP 60.208.116.117 就明显访问量异常

  • 来源归属地:中国 山东省 济南市 历下区
  • 运营商:中国联通

直接在阿里云服务器的安全组网络规则里,把这个 IP BAN 掉了。

统计今日请求量最多的 IP TOP 10

TODAY=`date +%d/%b/%Y:00:00:00`
awk -vToday=$TODAY '$4>Today {print $1}' access.log | sort | uniq -c | sort -nr | head -n 10

sort 参数

-n, --numeric-sort compare according to string numerical value

-r, --reverse reverse the result of comparisons

uniq 参数

-c, --count prefix lines by the number of occurrences

如果在 uniq 前不加 sort 会怎样?

uniq 默认只能消除相邻的重复行,并不能消除整个文件中的重复行。所以,先使用 sort 排序之后就能将整个文件中的重复行。

如何统计 TOP 10 中,大于某个阈值的量

假设阈值为 1000, e.g.

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10 \
	awk '$1>1000 print {$1, $2}'

在线查看工具

为了方便随时随地查看,我用 ASP.NET Core 实现了一个网页版的在线查看当前服务器实时 Nginx IP 访问统计的工具

微信关注我哦 👍

大象工具微信公众号

我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式

tags: nginx 日志统计