宝塔面板需通过流量限制配置+Shell脚本定时检测或到期时间设置实现超限关停。具体包括:一、启用站点流量限制并设KB阈值;二、创建Shell脚本读取流量日志并与阈值比对,超限则执行bt site stop;三、预估耗尽时间设为站点到期时间触发自动关停;四、高级用户可用Nginx+Lua实时统计并关停。

如果您在宝塔面板中管理网站,希望在站点流量超出预设上限时自动关停服务,则需结合流量限制功能与计划任务脚本实现联动控制。宝塔面板原生不提供“超限即停站”的一键开关,但可通过配置流量阈值并辅以Shell脚本检测与执行关停操作来达成该目标。以下是具体实施路径:
一、启用并配置站点流量限制
此步骤用于设定明确的流量监控基准,为后续脚本判断是否超限提供依据。宝塔面板的“流量限制”模块可记录并统计单个请求或总体带宽消耗,但需手动配置阈值并配合外部逻辑触发关停。
1、登录宝塔面板,点击左侧导航栏的网站,进入网站列表页面。
2、找到目标站点,点击其域名右侧的设置按钮。
3、在站点设置弹窗中,点击左侧导航栏的流量限制。
4、勾选启用流量限制,设置流量限制(单位:KB)为期望的单次请求上限值,例如5120 KB(即5MB);同时可设置并发限制与单IP限制作为辅助防护。
5、点击保存并启用,确保规则已生效。
二、创建流量超限检测与关停脚本
该脚本通过读取宝塔面板日志或使用内置API接口获取当前站点实时/累计流量数据,并与预设阈值比对;一旦确认超出,立即执行站点停用命令。需将脚本部署为定时任务运行。
1、在宝塔面板左侧菜单中点击计划任务,进入任务管理界面。
2、点击左上角添加任务,类型选择Shell脚本。
3、在脚本内容框中粘贴以下代码(请将your_site_name替换为实际站点域名,5242880替换为对应KB阈值,如5GB=5242880KB):
#!/bin/bash<br>site="your_site_name"<br>limit_kb=5242880<br>current_kb=$(bt site logs $site | grep -i "bandwidth" | tail -n 1 | awk '{print $NF}' | sed 's/[^0-9]//g')<br>if [ -z "$current_kb" ]; then current_kb=0; fi<br>if [ "$current_kb" -gt "$limit_kb" ]; then<br> bt site stop $site<br> echo "$(date): Site $site stopped due to bandwidth exceed $limit_kb KB" >> /www/server/panel/logs/bandwidth_limit.log<br>fi
4、设置执行周期为每5分钟(建议初试频率),确保及时响应超限事件。
5、点击添加任务完成创建。
三、利用站点到期时间模拟关停机制
该方法不依赖实时检测,而是将流量上限转化为时间维度控制:预先估算流量耗尽所需时间,设置站点到期时间,由宝塔后台自动于指定时刻关停站点。适用于流量模型稳定、可预测的场景。
1、登录宝塔面板,进入网站列表页。
2、定位目标站点,在“到期时间”列中点击当前显示的时间值。
3、在弹出的时间选择器中,输入预估流量耗尽日期与时间,例如2026-03-20 00:00:00。
4、点击确定保存设置。
5、宝塔面板将在该时刻自动将站点状态设为已停止,访问时返回默认停站页面。
四、通过Nginx配置+自定义日志触发Lua限流关停
此方法适用于高级用户,利用OpenResty或支持Lua模块的Nginx,在请求处理链路中嵌入流量统计与决策逻辑。当累积流量达阈值,直接返回503并调用系统命令关停站点服务。
1、确认服务器Nginx已编译Lua模块(如lua-nginx-module),或安装OpenResty环境。
2、编辑站点配置文件(路径通常为/www/server/panel/vhost/nginx/your_site.conf),在server块内插入如下Lua段落:
set $limit_reached 0;<br>access_by_lua_block {<br> local limit = 5242880 -- KB<br> local used = tonumber(ngx.shared.bandwidth:get("total")) or 0<br> if used > limit then<br> ngx.shared.bandwidth:set("status", "stopped")<br> os.execute("/www/server/panel/py/bin/python /www/server/panel/class/web_api.py stopSite your_site_name")<br> ngx.exit(503)<br> end<br>}
3、在http块顶部添加共享内存声明:lua_shared_dict bandwidth 10m;。
4、重启Nginx服务:bt restart nginx。










