在 Nginx 的 access_log 中,状态码是评估请求成功与否的关键指标之一。当遇到问题如服务器错误(5xx系列)、客户端错误(4xx系列)或是其他特定代码时,能够快速定位请求源变得至关重要。以下是针对特定 HTTP 状态码,如 404 Not Found,追踪相关请求的 IP 地址及请求次数的有效方法。
基础命令
首先,让我们聚焦于如何从 Nginx 日志中抽取出对应某个状态码的所有记录:
grep ' 404 ' /var/log/nginx/access.log
这将列出所有包含 ” 404 “(空格后紧跟 404 后还有空格)的日志行,也就是 HTTP 404 Not Found 错误。
抽取 IP 地址
接着,从这些记录中提取 IP 地址。由于 IP 地址通常位于每行的第一个字段,可以使用 awk 命令:
grep ' 404 ' /var/log/nginx/access.log | awk '{print $1}'
计算请求次数
再进一步,我们要统计每个 IP 发起此类请求的次数:
grep ' 404 ' /var/log/nginx/access.log |
awk '{print $1}' |
sort |
uniq -c
组合命令
将上述命令串接起来,形成一次性执行的功能链:
grep ' 404 ' /var/log/nginx/access.log |
awk '{print $1}' |
sort |
uniq -c
为了更好地理解和阅读结果,我们可以添加额外的 sort 和 head 指令,展示请求次数最多的前 10 个 IP:
grep ' 404 ' /var/log/nginx/access.log |
awk '{print $1}' |
sort |
uniq -c |
sort -nr |
head -n 10
创建可重用脚本
为了便利性和重复使用,你可以把这些命令打包进一个 shell 脚本里:
#!/bin/bash
status_code="$1"
grep " ${status_code} " /var/log/nginx/access.log |
awk '{print $1}' |
sort |
uniq -c |
sort -nr |
head -n 10
保存为 .sh 文件,如 track_ip_by_status.sh,赋予执行权限 (chmod +x track_ip_by_status.sh),即可通过传递不同的 HTTP 状态码参数运行它。
扩展技巧
- 使用正则表达式匹配更多状态码模式。
- 结合日志分割,对历史日志进行趋势分析。
- 自动化日志清理或压缩以维持系统性能。
通过上述方法,你不仅可以快速追踪 Nginx 中特定状态码相关的请求 IP 及请求次数,还能在此基础上扩展出更复杂的日志分析场景。