
流量异常飙升不是“服务器变慢”的表象,而是具体 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 里,往往意味着问题已经从边界渗透到了应用层内部。

评论(0)