快速识别 Nginx 中请求量最大的 N 个 IP 地址
在 Nginx 中,通过分析 access_log 文件,你可以轻松找出请求次数最多的 IP 地址。下面是一种高效的查询方法,采用 shell 脚本和常用工具 awk、sort 和 uniq。
假设你的 access_log 文件位于 /var/log/nginx/access.log ,并且你想找出请求最多的前 10 个 IP 地址,可以按照以下步骤操作:
步骤 1: 提取 IP 地址
首先,从 access_log 文件中提取 IP 地址部分。通常,IP 地址是每行的第一项,使用 awk 命令实现:
awk '{print $1}' /var/log/nginx/access.log > ip_list.txt
步骤 2: 统计 IP 出现频率
接下来,统计每个 IP 地址出现的频次。使用 sort 和 uniq 命令配合 -c 参数:
cat ip_list.txt | sort | uniq -c > ip_count.txt
此时,ip_count.txt 包含了每个 IP 地址及其出现的次数。
步骤 3: 排序并选取前 N 名
最后,我们按出现次数降序排序并取出前 N 个结果。这里以求前 10 名为例:
cat ip_count.txt | sort -nr | head -n 10
完整的一次性执行命令:
awk '{print $1}' /var/log/nginx/access.log |
sort |
uniq -c |
sort -nr |
head -n 10
加入管道到单行
为了方便多次执行,可以将以上命令整合成一个函数或 shell 脚本:
#!/bin/bash
function top_ips() {
awk '{print $1}' "$1" |
sort |
uniq -c |
sort -nr |
head -n "${2:-10}"
}
top_ips /var/log/nginx/access.log 10
这样,top_ips 函数就接受两个参数:日志文件位置和需要返回的顶级 IP 数量,默认为 10。
注意事项
- 在实际应用中,access_log 文件可能会很大,导致上述命令执行耗时较长,尤其是 sort 命令。如果发现性能问题,可以考虑先用 logrotate 或其他工具分割日志文件,或将日志处理脚本放到定时任务中定期执行,避免在高峰时间执行。
这种方法适合日常运维检查和故障排除,可以快速锁定请求量大的 IP,辅助进一步的安全审计和性能优化工作。