精确查找 Nginx 中请求次数超过 N 次的 IP 地址
要在 Nginx 访问日志中找出请求次数超过特定阈值 N 的 IP 地址,可以通过一系列 Unix/Linux 命令行工具完成。下面是具体步骤,假设你的目标是筛选出请求次数超过 100 次的 IP 地址。
步骤说明:
- 提取 IP 地址:从 access_log 中抽取 IP 地址。
- 统计频率:计算每个 IP 地址出现的次数。
- 过滤:移除未达阈值的 IP。
- 显示结果:输出符合条件的 IP 地址列表。
操作指令:
- 提取 IP 地址:
awk '{print $1}' /var/log/nginx/access.log > ip_list.txt - 统计 IP 出现频率:
cat ip_list.txt | sort | uniq -c > ip_freq.txt - 筛选大于 N 次的 IP: 我们加入一个条件判断,只保留请求次数超过 100 的 IP 地址:
grep '^[[:space:]]*[1-9][0-9]*[[:space:]]' ip_freq.txt | awk '{if ($1>100) print $2}'
这里的正则表达式 '^[[:space:]]*[1-9][0-9]*[[:space:]]' 确保我们捕获的是那些前面带有空白字符并以非零数字开头的行(即请求次数),而 awk 则进一步过滤出那些请求次数超过 100 的 IP 地址。
为了简化操作,我们可以把所有这些命令放在一个 Shell 脚本中:
#!/bin/bash
# 定义阈值
threshold=100
# 抽取 IP 并统计
awk '{print $1}' /var/log/nginx/access.log |
sort |
uniq -c |
grep "^[[:space:]]*[1-9][0-9]*[[:space:]]" |
awk "{if (\$1>$threshold) print \$2"
这个脚本直接从 Nginx access_log 文件读取,逐级过滤并最终输出请求次数超过设定阈值的 IP 地址。
注意事项:
- 日志文件大小:大型日志文件可能导致较高的内存消耗。在这种情况下,考虑使用日志循环(log rotation)策略,或将此脚本作为批处理作业定期执行,而不是实时分析整个文件。
- 安全性:在分析大量请求的来源时,注意潜在的安全攻击,如 DDoS 或爬虫,对异常行为进行及时响应。
该方法提供了一个高效的方式去追踪和识别高频请求的源头,有助于系统管理员进行性能优化或安全防护措施制定。