访问日志分析:找异常请求与慢页面
发布时间:2026-06-04 20:13       
更新时间:2026-06-05 04:22
Nginx 的访问日志记录了每一个请求的来源、路径、状态码和耗时,异常流量和慢页面都藏在这个文件里。分析它只需要 awk 和 sort 这类基础工具。
## 一、先把耗时字段加上
默认的 combined 日志格式没有响应耗时,先在 http 块里改 log_format:
```
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $request_time';
access_log /var/log/nginx/access.log main;
```
$request_time 单位是秒,固定放在行尾。nginx -t 检查后 reload,之后的日志就带耗时了。老日志还是旧格式,统计前先确认文件里没有混着两种行,必要时从 reload 时间点之后的新文件开始分析。
## 二、统计访问最多的 IP
```
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
```
输出第一列是请求次数,第二列是 IP。次数遥遥领先的来源不一定都是攻击,先看它在请求什么路径、用什么客户端标识(awk -F'"' '{print $6}' 可单独统计 User-Agent),确认恶意再处理。自己的监控拨测和公司出口 IP 常年霸榜,先排除掉,它们会干扰判断。
## 三、把慢页面找出来
```
awk '$NF>1 {print $7, $NF}' /var/log/nginx/access.log | sort -k2 -rn | head -20
```
列出耗时超过 1 秒的请求,按耗时倒序。慢的集中在一两个接口,就去查对应代码和 SQL;整站都慢,先看服务器负载、磁盘 IO 和带宽水位,两个方向的处理完全不同。再按小时分桶统计慢请求条数,能看出慢是集中在某个时段还是全天均匀分布,前者查定时任务和备份窗口,后者查容量水位。
## 四、和封禁动作联动
确认恶意来源后,单 IP 用防火墙处理:
```
iptables -I INPUT -s 1.2.3.4 -j DROP
```
来源分散但特征明确的,用 fail2ban(日志匹配自动封禁工具)配正则自动处理,规则里务必先加白名单,把自己办公网的出口 IP 保护起来,防止误伤自己。每次封禁留个记录,写明原因和时间,方便回溯。封禁规则每周复审一次,过期条目及时清掉,规则表越长,误伤的概率越大。
日志文件会持续增长,用 logrotate(日志切割工具)配好按天切割和压缩,分析脚本才有长期跑的条件。有了这套日常动作,异常流量从"感觉不对"变成"日志里看得见"。