直接查 access.log 即可定位流量异常源头:用 awk 统计高频 IP,结合 $http_x_forwarded_for(CDN 场景)、User-Agent 和请求路径交叉分析,识别爬虫特征(如 Bot/Spider、扫 /api/、大量 404/499),若 IP 为 127.0.0.1 则表明是内部脚本循环调用所致。

流量异常飙升不是“服务器变慢”的表象,而是具体 IP 在单位时间内发起大量请求的实锤证据。直接查 access.log 就能定位源头,不需要猜。
怎么看日志里谁在猛刷?
宝塔默认日志路径是 /www/wwwlogs/yourdomain.com.log,用命令快速筛出高频 IP:
-
awk '{print $1}' /www/wwwlogs/yourdomain.com.log | sort | uniq -c | sort -nr | head -20—— 统计最近所有请求中出现次数最多的前 20 个 IP - 如果用了 CDN 或反向代理,
$1可能是回源 IP(如127.0.0.1),得改用$http_x_forwarded_for字段,前提是 Nginx 日志格式里真写了它 - 加时间过滤更准:比如只看最近一小时,可先用
grep "$(date -d '1 hour ago' '+%d/%b/%Y:%H')"截取日志段再统计
怎么区分是爬虫还是真实用户?
单看 IP 频次不够,得结合 User-Agent 和请求路径交叉判断:
- 执行
grep "123.45.67.89" /www/wwwlogs/yourdomain.com.log | head -30(把 IP 换成你怀疑的那个),观察$http_user_agent字段是否为空、极简(如-或Mozilla/5.0)、含Bot/Crawler/Spider等关键词 - 检查请求 URI 是否集中扫
/api/、/wp-json/、/tag/、/feed/这类非展示型路径 - 看状态码分布:大量
404(路径探测)、499(客户端主动断连,常见于扫描器超时重试)、200但响应体极小(如返回空 JSON 或重定向)都是典型爬虫特征
为什么有些 IP 显示为 127.0.0.1?
这不是本地访问,而是 Nginx 和 PHP-FPM 通信被日志记录成了客户端 IP,说明问题出在服务内部:
- 常见于 PHP 脚本写死循环调自己接口(比如
file_get_contents("http://127.0.0.1/api/v1/data")) - 也可能是 WordPress 插件或自定义定时任务反复触发钩子,最终压垮 PHP-FPM 子进程
- 此时
access.log里会看到大量相同 URI + 相同 UA(常是PHP或空)+ 极短响应时间(pid 下 - 必须去
/www/wwwlogs/yourdomain.com.error.log查对应时间点的 PHP 错误或超时记录
日志分析后下一步做什么?
确认是恶意行为后,别只删日志或重启服务:
- 如果是已知爬虫 UA(如
Baiduspider、Bytespider),优先在宝塔「Nginx 防火墙」→「User-Agent 过滤」里加规则禁止,不重启也能生效 - 如果是无 UA + 敏感路径组合(如
GET /api/user/list HTTP/1.1+User-Agent: ""),要在站点 Nginx 配置的server块里补if判断并return 403 - 若发现某 IP 真实在刷接口且带有效 UA(比如伪装成 Chrome),就得上 Nginx 限流:
limit_req zone=api burst=5 nodelay,否则封 IP 容易误伤
日志本身不会撒谎,但解析方式决定你能看到多深——IP 频次只是入口,UA 和 URI 的组合模式才是识别意图的关键,而 127.0.0.1 出现在 access.log 里,往往意味着问题已经从边界渗透到了应用层内部。


















