刚部署完ManusAI,还没来得及庆祝,一个棘手问题就暴露了——某个IP地址开始疯狂调用,沙箱容器被一个接一个地创建,Chrome实例接连崩溃,API响应时间直接飙升到令人抓狂的地步。这几乎是每个自建AI服务都会遇到的瓶颈。解决之道其实并不复杂:在Nginx层通过QPS限流来卡死。

一旦将ManusAI开放到公网,各种稀奇古怪的请求便会蜂拥而至。单IP的高频调用会直接导致沙箱容器创建过载、Chrome实例连续崩溃、API响应延迟急剧升高。因此,必须立即在Nginx层实施精细化的每秒访问频率限制。下面直接讲解具体操作步骤。
通过Nginx配置文件手动限流(推荐方案)
首先需要明确一点:宝塔面板自带的“流量限制”功能仅支持60秒内的总次数控制,无法实现真正的QPS(每秒请求数)限流。所以,必须直接编辑站点的Nginx配置文件,在http块与location块中协同使用limit_req指令。
第一步,登录宝塔面板,进入网站管理,找到ManusAI对应的域名,点击【设置】,然后切换到【配置文件】选项卡。
第二步,在文件顶部http {大括号内的第一行插入限流区域的定义:limit_req_zone $binary_remote_addr zone=manus_ip:10m rate=8r/s;
这段代码的逻辑很清晰:将客户端IP压缩为二进制存储,10m内存大约能容纳16万个独立IP的状态信息。需要特别留意的是,rate值必须为整数,不支持3.5r/s这类小数写法。
第三步,向下滚动,找到location / {或location /api/ {块——ManusAI的核心接口通常位于/api路径下。在此块内部添加启用指令:limit_req zone=manus_ip burst=12 nodelay;
burst=12表示允许瞬时突发12个请求,nodelay的作用是让这些请求要么立即通过,要么直接拒绝,不做排队延迟。为什么一定要加上nodelay?因为ManusAI的沙箱容器启动耗时较高,如果去掉该参数,Nginx会将超频请求匀速释放,最终导致延迟响应、并发堆积,甚至引发雪崩。
第四步,点击右上角【保存】,然后返回站点设置页,进入【SSL】选项卡,点击【重载配置】。注意,是重载配置,不是重启Nginx——重启会中断所有正在运行的沙箱会话,这个代价非常巨大。
使用宝塔防火墙插件进行图形化限流(专业版可用)
如果你已购买了宝塔专业版或企业版,并且不想手写Nginx语法,那么可以通过防火墙插件快速开启CC防护。不过,它默认会对全站生效,需要额外配置才能精准作用于ManusAI的/api路径。
方法一,全局基础防护。进入【软件商店】,搜索并安装【宝塔防火墙】。安装完成后,点击【宝塔防火墙】,找到【CC防护】,开启开关,然后将【单IP每秒请求数】设为8,最后点击【重启防火墙】。
方法二,路径级精准控制,这是关键一步。在【宝塔防火墙】中进入【自定义规则】,点击【添加规则】。规则类型选择【按IP限速】,填写目标域名(例如manus.yourdomain.com),在【URL匹配】栏输入正则:^/api/.*。【触发条件】设为“单IP每秒请求超过”7次,【动作】选择【拒绝访问】。保存后务必点击【重启防火墙】。这里有一个容易踩的坑:如果没有填写URL匹配正则,这条规则将对整个域名生效,很可能误杀前端静态资源的请求。
区分ManusAI用户会话与爬虫的差异化限流
真实用户与爬虫之间的区别,往往只在于一个请求头。ManusAI的合法用户通常会携带特定的Header,例如X-Manus-Session,而恶意脚本或爬虫则不会携带。利用map指令,我们可以构造一个动态限流键,让合法会话免于限流,仅压制那些裸IP请求。
在站点配置文件的http{块顶部(注意,必须在limit_req_zone之前)插入:
map $http_x_manus_session $limit_key {
default "";
~^.+$ $binary_remote_addr;
}这段代码的逻辑是:当请求头中存在非空的X-Manus-Session时,$limit_key取IP值;否则取空字符串,不计入限流统计。
然后,修改限流区域的声明:limit_req_zone $limit_key zone=smart_manus:10m rate=50r/s;
再将location块中的启用指令改为:limit_req zone=smart_manus burst=50 nodelay;
完成上述配置后,带有效会话头的用户请求完全不受限制,而那些扫描器、暴力探测脚本之类的裸IP请求,依然会被严格限制在50r/s以下。这才是真正意义上的智能化限流策略。
