经常遇到服务器被恶意扫描,或者爬取内容的情况,这时候就可以通过统计 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 聊聊, 查看更多联系方式