服务器带宽占满定位,爬虫还是真实访客:服务器带宽占满定位
服务器带宽突然被占满时,先别急着升级带宽。
多数情况下是爬虫在短时间内发起了大量请求,或者是某个真实访客在下载大文件。
本文会带你从日志和实时连接入手,快速判断流量来源,并给出封禁或限速的具体操作。
先看实时带宽和连接数
登录服务器后,先确认带宽被谁占用了。
用 iftop 查看实时流量(如果没有,先 yum install iftop 或 apt install iftop):
iftop -P -n
-P 显示端口,-n 不解析域名。
观察哪个 IP 的流量最大。
同时查看当前连接数:
ss -ant | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20
如果某个 IP 的连接数超过 50,且流量很大,大概率是爬虫或恶意扫描。
真实访客通常不会保持大量并发连接。
从 Nginx 日志里找出高频 IP
假设你的网站用 Nginx,访问日志在 /var/log/nginx/access.log。
统计访问量前 10 的 IP:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
如果某个 IP 的请求数远高于其他,比如几千次,基本可以判定是爬虫。
再看这个 IP 请求的 URL:
grep '1.2.3.4' /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20
爬虫通常集中抓取列表页、搜索页或动态参数页面。
还可以检查 User-Agent:
grep '1.2.3.4' /var/log/nginx/access.log | awk -F'"' '{print $6}' | sort | uniq -c | sort -rn
如果 User-Agent 是 python-requests、curl、Go-http-client 等,基本可以确认是脚本爬虫。
判断是爬虫还是真实访客
关键看三个特征:
- 请求频率:真实访客每分钟几个请求,爬虫可能每秒几十个。
- 访问路径:真实访客会加载 CSS、JS、图片,爬虫往往只抓 HTML。
- User-Agent 和 IP 归属:爬虫常用固定 UA 或来自 IDC 机房 IP。
如果日志里某个 IP 在 1 分钟内请求了 200 次以上,且只抓 HTML,基本可以确定是爬虫。
如果流量来自多个 IP,但 UA 相同,可能是分布式爬虫,需要进一步分析。
封禁爬虫或限制访问频率
确认是爬虫后,可以用 Nginx 限制频率。
在 http 块中加入:
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
然后在 server 或 location 块中启用:
limit_req zone=one burst=20 nodelay;
这样每个 IP 每秒最多 10 个请求,超过的会被延迟或拒绝。
如果确定是恶意 IP,直接用 iptables 封禁:
iptables -I INPUT -s 1.2.3.4 -j DROP
宝塔面板用户可以在“安全”->“IP规则”中添加黑名单。
验证效果与常见问题
封禁或限速后,用 iftop 再看带宽是否下降,同时观察 Nginx 错误日志:
tail -f /var/log/nginx/error.log
如果看到 limiting requests 说明限速生效。
常见问题:
- 限速后真实用户也变慢:适当调大
rate和burst,比如rate=20r/s burst=50。 - 爬虫换了 IP 继续抓:可以结合 UA 封禁,在 Nginx 中判断
$http_user_agent。 - 日志太大不好分析:用
logrotate切割日志,或只分析最近 1 小时:awk -v d="$(date -d '-1 hour' '+%d/%b/%Y:%H')" '$4 ~ d' access.log。
如果带宽依然占满,且流量来自大量分散 IP,可能是 DDoS,建议联系机房或接入 CDN 清洗。
最后提醒
处理带宽占满时,优先用日志和连接数确认来源,不要盲目重启或升级配置。
封禁爬虫后记得观察一段时间,确保没有误伤真实用户。
如果业务本身流量增长,再考虑升级带宽或使用对象存储分流。