服务器带宽跑满怎么办?零基础排查与急救指南
你的网站变慢了?先别急着重启,三步找出带宽杀手
服务器带宽跑满是最常见也最让人头疼的问题之一:网站加载缓慢、图片刷不出来、甚至远程连接都断开。
遇到这种情况,很多新手会直接重启服务器,但重启治标不治本,流量很快又会涨回去。
本文从零基础出发,带你一步步定位流量来源并解决问题,全部操作都可以在 SSH 下完成,不需要额外安装面板。
准备阶段:确认你有 SSH 权限和基础工具
在执行排查之前,确保你能够通过 SSH 登录服务器(Windows 用 PuTTY,Mac/Linux 直接终端)。
大部分 Linux 发行版默认没有安装 iftop 和 nethogs,需要先安装它们:
# CentOS / Rocky Linux
yum install -y epel-release
yum install -y iftop nethogs
# Ubuntu / Debian
apt update && apt install -y iftop nethogs
如果 yum 或 apt 命令报错,那是因为网络太慢?
可以先尝试用 ping baidu.com 检查基础连通性,如果连 ping 都丢包,说明带宽已经被占满,安装软件包可能失败,这时可以用备用方案——系统自带的 ss 和 netstat 命令快速查看连接数。
手工排查:用 iftop 和 nethogs 揪出流量大户
1. 查看整体带宽流向(iftop)
执行以下命令,按 T 可以切换流量单位,按 p 显示端口:
iftop -i eth0 # 将 eth0 替换为你实际的网卡名称,可以用 ip addr 查看
界面上方会显示实时进出流量,下方按 IP 和端口列出占用带宽的通信对。
如果你看到某个 IP 持续向你发送大流量(比如几十 Mb/s),很可能就是攻击或大量下载。
记住那个 IP 地址。
2. 按进程定位流量(nethogs)
nethogs 能显示每个进程占用的带宽,非常适合发现是哪个程序(比如 nginx、php-fpm、或者恶意进程)在发疯:
nethogs eth0
如果提示“process not found”,请用 root 或 sudo 运行。
你会看到类似这样的输出:
PID USER PROGRAM SENT RECEIVED
12345 www-data nginx: worker process 1.2 MB/s 25 MB/s
这说明 nginx 正在大量接收流量,可能是被刷了或者服务异常。
3. 快速查看连接数(ss 命令)
iftop/nethogs 安装失败时,可以用 ss 统计连接状态:
ss -ant | grep :80 | wc -l # 统计端口 80 的 TCP 连接数
ss -ant | grep SYN-RECV | wc -l # 统计半连接,如果数值很高说明可能遭受 SYN Flood 攻击
如果连接数达到几千甚至上万,基本可以断定被攻击了。
常见元凶和解决方法
攻击流量(DDoS / CC)
- 症状:大量陌生 IP 发请求,CPU 可能也会飙升。
- 临时方案:在 iptables 或防火墙中封掉来源 IP(如果是单点攻击)。
iptables -A INPUT -s 恶意IP -j DROP
- 长期方案:接入 CDN 或高防 IP,配置 WAF。
爬虫或采集
搜索引擎爬虫或恶意采集也会占满带宽。
可以用日志分析,限制 User-Agent 或频率:
# nginx 限制单个 IP 连接数(http 段)
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 10;
日志文件过大导致磁盘 I/O 异常
访问日志、错误日志、慢查询日志如果一直写,也会消耗带宽(尤其是 syslog 发送到远程)。
检查日志文件大小:
du -sh /var/log/*.log
如果某日志超过 1GB,建议关闭访问日志或配置 logrotate 轮转。
程序后门或挖矿病毒
nethogs 中看到不明进程(例如随机名称的二进制),用 ps aux 查看其路径,然后 kill 并删除文件,再检查开机自启动项。
避坑指南
- 不要直接重启服务器:重启后旧进程消失,但恶意脚本或定时任务很可能还会重新启动。一定要先找到根因。
- 不要随意升级内核或禁用防火墙:稳定大于一切,先隔离流量,再慢慢修补。
- 如果你使用的是宝塔面板,可以在“面板设置 -> 安全 -> 防火墙”中添加来源 IP 规则,或在“监控”页面查看带宽趋势。
- 如果带宽瞬间跑满导致 SSH 连接不上:联系机房或云服务商请求紧急限流,或通过 VNC/控制台进入。
效果验证:如何确认带宽已经恢复正常?
完成上述操作后,重复执行以下命令:
iftop -i eth0 -t -s 5 # 显示5秒的平均流量
观察流量是否下降到正常范围(比如低于 1Mb/s)。
同时用 curl -I http://你的域名 测试页面响应,或者直接打开浏览器访问。
如果速度明显变快,说明问题已解决。
建议后续开启持续监控:使用 nload 或 vnstat 记录带宽历史,一旦突发流量可自动报警。
如果问题反复出现,考虑升级带宽或接入 CDN。
以上就是一个完整的服务器带宽跑满排查与急救流程,零基础也能照着做。
如果你在处理过程中遇到其他异常,欢迎在评论区留言,我会根据常见场景补充解决方案。