宝塔面板服务器流量饱和时可通过四种方法自动降级:一、解析 /proc/net/dev 实时监控并停非核心服务;二、调用宝塔 API 动态关停高流量站点;三、用 tc+iptables 实施端口限速;四、集成 Prometheus 告警触发 Webhook 执行降级。

当宝塔面板托管的服务器网络流量达到饱和状态时,可能引发响应延迟、服务不可用等问题。为保障核心服务持续可用,可通过脚本实时监控流量并触发自动降级策略。以下是实现该目标的多种可行方法:
一、基于 /proc/net/dev 的实时流量检测 + 服务停启脚本
该方法通过解析系统网络接口统计文件获取当前入 / 出流量速率,当连续多次采样超过阈值时,自动停止非核心服务(如 PHP-FPM、Redis、或特定站点)。
1、创建监控脚本 /www/server/monitor/traffic_degrade.sh,并赋予执行权限:
chmod +x /www/server/monitor/traffic_degrade.sh
2、在脚本中定义网卡名(如 eth0)、流量阈值(单位:KB/s)、采样间隔(秒)及待降级服务名(如 php-fpm):
3、使用 awk 读取 /proc/net/dev 中对应网卡的 RX 和 TX 字节数,计算每秒增量,取两者最大值作为当前流量速率。
4、若连续 3 次检测值均 ≥ 阈值,则执行 systemctl stop php74-fpm(以 PHP 7.4 为例)或 bt stop php(调用宝塔命令停用指定 PHP 版本)。
5、添加定时任务,每 30 秒运行一次:
*/30 * * * * /bin/bash /www/server/monitor/traffic_degrade.sh > /dev/null 2>&1
二、利用宝塔 API 配合自定义 Shell 脚本实现站点级降级
该方法不中断系统服务,而是通过宝塔开放的 API 动态关闭高带宽消耗站点,保留基础 Web 服务与管理后台可用。
1、在宝塔面板【安全】→【API 接口】中启用 API,并记录 Key 与端口(默认 8888)。
2、编写脚本调用宝塔 API 查询所有站点状态与绑定域名,再结合 netstat 或 ss 命令统计各站点关联进程的连接数与流量估算值。
3、识别出近 5 分钟平均出口流量最高的前 2 个站点,构造 JSON 请求体,调用 /site/stop 接口关停对应站点 ID。
4、关停后向宝塔日志目录写入记录:
echo “$(date): 自动降级站点 [站点名],瞬时出口流量 128.4 MB/s” >> /www/wwwlogs/autodegrade.log
5、将脚本加入 crontab,每 2 分钟执行一次,避免频繁抖动。
三、使用 tc+iptables 构建流量整形 + 自动限速脚本
该方法不关闭服务,而是对指定端口或 IP 实施实时限速,使高负载下仍维持基本响应能力,属于软性降级。
1、确认内核已加载 sch_fq_codel 模块:
modprobe sch_fq_codel
2、创建限速规则:对 80/443 端口出方向限制为 5MB/s,使用 tc 命令配置 HTB 队列并绑定 iptables 标记:
3、编写判断脚本,使用 iftop -P -t -L 1 输出前 10 行,提取“Total send rate”数值,若 ≥ 8388608 字节 / 秒(即 8MB/s),则激活限速规则。
4、限速激活后,通过 iptables -t mangle -A OUTPUT -p tcp –dport 80 -j MARK –set-mark 1 标记流量包。
5、使用 tc class add dev eth0 parent 1: classid 1:1 htb rate 5mbit 实施带宽控制。
四、集成 Prometheus+Alertmanager+Webhook 触发宝塔操作
该方法适用于已有监控体系的生产环境,通过指标告警驱动降级动作,具备高可靠性和可追溯性。
1、部署 node_exporter 采集 node_network_receive_bytes_total 与 node_network_transmit_bytes_total 指标。
2、在 Prometheus 中配置 Recording Rule,计算 5 分钟平均出口带宽:rate(node_network_transmit_bytes_total{device=~”eth.*”}[5m]) * 8
3、设置 Alert 规则,当该值持续 2 分钟 > 62914560(即 60Mbps)时,触发 Alertmanager Webhook。
4、Webhook 接收端为轻量 Python 服务,收到告警后调用宝塔本地命令 bt stop sites 或执行 curl -X POST “http://127.0.0.1:8888/site/stop” -H “Content-Type: application/json” -d ‘{“siteName”:”demo.com”}’ -d “key=xxx”
5、降级动作执行完毕后,向企业微信机器人推送通知,包含触发时间、当前带宽值及受影响站点。