服务器被刷、被扫描、发现异常请求时,第一件事就是翻 Nginx 访问日志。与其慢慢翻,不如直接用 awk 做聚合分析,几秒定位问题 IP。下面几条命令覆盖最常见场景,复制即用。
1. 按返回状态码统计请求量
awk '{print $9}' access.log | sort | uniq -c | sort -rn | head -20一般 200/304 是正常,403/502/503 频繁出现说明有问题,404 量级异常大可能是扫描器或 404 探测。
2. 找出请求量最大的 TOP 20 IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20某 IP 请求量吊打其他所有 IP,基本就是抓取或攻击源,可以直接 ban 掉。
3. 统计 5xx 错误里哪个 IP 触发最多
awk '$9 >= 500 {print $1}' access.log | sort | uniq -c | sort -rn | head -204. 找出响应时间超过 5 秒的慢请求
# 日志格式需含 $request_time,放在 $10 位置(按你的 log_format 调整列号)
awk '$10 > 5 {print $1, $7, $10}' access.log | sort -k3 -rn | head -205. 找出被高频访问的具体 URL
awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -20实战组合
先跑第 2、3 条确认异常 IP,再看该 IP 具体请求了什么:
grep '1.2.3.4' access.log | awk '{print $6, $7, $9}' | sort | uniq -c | sort -rn | head定位到 IP 和 URL 后,再用防火墙或 Nginx deny 规则封禁即可。建议把这几条命令存成 shell 函数,服务器出问题直接调用。