网站带宽限制与流量管控设置指南
先说清楚:为什么要做带宽限制与流量管控
网站跑着跑着突然变慢、被恶意刷流量导致账单超支、或者共享带宽被一个站点占满 —— 这些场景都逼着你必须对网站带宽做限制。
说白了,带宽限制就是给每个网站/连接设置一个最大速度(比如 10Mbps);流量管控则是控制一段时间内总流量(比如每月 100GB),超了自动限速或关停。
下面我用三种最常见的方法讲清楚操作流程。
准备工作:你需要确认这些条件
- 服务器操作系统:本文以 CentOS 7/8 和 Ubuntu 20.04+ 为例,命令兼容性已标注。
- 权限:所有操作需要 root 或 sudo 权限。
- 可选面板:如果你装了宝塔面板(版本 7.9+),第一种方法可直接用。
- 基础工具:确保系统已安装
wget、curl、ifconfig(或ip命令)。
另外,建议先用 uname -r 确认内核版本,tc 命令在 2.6 以上内核都能正常工作。
方法一:宝塔面板网站带宽限制(适合新手)
如果使用了宝塔面板,最快捷的方式是在网站设置里直接限速。
操作路径:
- 登录宝塔面板 → 左侧【网站】→ 找到目标站点 → 点击【设置】。
- 在弹窗中选择【限流】选项卡(如果没有,需要先安装 Nginx 或 Apache 的扩展)。
- 勾选【开启限流】。
- 填写单连接速度限制(单位 KB/s):例如
1024表示单个连接最多 1MB/s。 - 填写总带宽限制(单位 Mbps):例如
10表示该站点所有连接最多占用 10Mbps。 - 点击保存即可生效。
注意:宝塔的限流是基于 Nginx limit_rate 模块,只能限制 HTTP 响应速度,对 UDP、TCP 等其他协议无效,且对慢速攻击(Slowloris)防御有限。
方法二:使用 tc 命令精确限制网站带宽(推荐服务器级)
tc(Traffic Control)是 Linux 内核自带的流量控制工具,可以对 IP、端口甚至具体进程做限速。
下面限制目标服务器 IP 为 192.168.1.100 的网站流量不超过 5Mbps。
# 第一步:创建根队列规则(假设网卡为 eth0)
tc qdisc add dev eth0 root handle 1: htb default 30
# 第二步:创建根类别(限制总带宽为 5Mbps)
tc class add dev eth0 parent 1: classid 1:1 htb rate 5mbit ceil 5mbit
# 第三步:创建子类别并匹配目标 IP
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 5mbit ceil 5mbit
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.1.100 flowid 1:10
测试效果:从服务器往外下载一个文件,用 wget -O /dev/null http://192.168.1.100/somefile 观察速度是否被限制在 5Mbps 左右。
如果要取消限制:
tc qdisc del dev eth0 root
避坑:tc 规则重启后失效,建议写入 /etc/rc.local 或 systemd 服务脚本。另外,如果服务器有多个网卡,必须选对实际流量出口的网卡。
方法三:Nginx 限速 + 流量管控脚本(兼顾应用层与总量)
3.1 限制单连接速度
在 Nginx 配置文件(如 /etc/nginx/nginx.conf 或网站配置)的 server 或 location 块中添加:
http {
# 定义一个限速 zone(10MB 共享内存,记录客户端 IP 和速度)
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_rate_zone $binary_remote_addr zone=con_rate:10m rate=500k;
server {
listen 80;
server_name example.com;
# 每个 IP 最多同时 5 个连接
limit_conn addr 5;
# 每个连接速度限制为 500KB/s
limit_rate 500k;
location / {
proxy_pass http://backend;
}
}
}
注意:limit_rate 限制的是每个请求(每个连接)的响应速度,不能直接限制整个站点的总带宽。
3.2 实现月流量总量管控(脚本 + cron)
可以利用 vnstat 统计流量,当超过阈值时自动禁用网站配置或 nftables 规则。
#!/bin/bash
# 每月流量上限(单位 GB)
LIMIT=100
# 网卡接口
IF=eth0
# 本月已使用流量(vns 输出格式可调)
USED=$(vnstat -i $IF -m --json | jq '.interfaces[0].traffic.months[-1].total.tx + .interfaces[0].traffic.months[-1].total.rx' | awk '{print $1/1024/1024/1024}')
if (( $(echo "$USED > $LIMIT" | bc -l) )); then
# 超过限制,执行操作:例如移除网站 Nginx 配置
rm -f /etc/nginx/sites-enabled/example.com
nginx -s reload
# 或添加 iptables 规则丢弃该网站 IP 的流量
iptables -A OUTPUT -d 192.168.1.100 -j DROP
echo "$(date): 流量超限,已禁用 example.com" >> /var/log/flow_control.log
fi
将此脚本加入 cron 每天执行一次:0 0 * * * /root/flow_limit.sh。
避坑指南与高频问题
Q:为什么 tc 限速后速度没变?
A:检查是否找错了网卡(用 ip addr 查看主要网卡名);确认没有其他 tc 规则冲突(先 tc qdisc del dev eth0 root 清空再试);部分云服务器(如 AWS、阿里云)的虚拟化环境可能不支持 tc 限速,此时只能依赖云服务商自带限速功能。
Q:宝塔面板限速后网站更卡了?
A:单连接限速值设得过低(如 100KB/s)会导致正常浏览图片都要等很久。建议根据网站平均页面大小估算:若页面 2MB,希望 3 秒加载完,单连接速度应设为 2*1024/3 ≈ 683KB/s。
Q:如何知道当前实际带宽使用情况?
A:用 iftop -n, nethogs 或 bmon 实时查看。也可以装 vnstat 记录历史。
Q:流量管控脚本里 vnstat 没数据?
A:先执行 vnstat -u -i eth0 创建数据库,等待几分钟收集数据。
验证限速效果的两种方式
- 命令行测速:在另一台机器用
wget -O /dev/null http://your-site.com/bigfile.zip,观察下载速度。限制前和限制后分别测试对比。 - 浏览器开发者工具:打开 F12 → Network 标签页,看单个请求的“Time”和“Size”,计算速度(尺寸/时间)。
如果速度与设置值吻合,说明限速生效。
写在最后
网站带宽限制与流量管控设置不是一劳永逸的事,要根据实际访问量和业务类型微调。
新手优先使用宝塔面板的图形界面快速上手;
熟悉后建议用 tc 或 Nginx 配置实现更精细的控制。
遇到问题先回看上面的避坑部分,再做针对性排查。