接口被刷时,限速该配在网关层还是配在程序里

📅 2026-10-10 👁️ 0

站点接口被大量请求刷时,速率限制应该配在 Web 服务器网关层还是配在程序里?两层都配,但它们拦的不是同一件事:网关层按来源地址限请求速率,请求还没进程序就被压掉;程序层知道调用方是谁、在做哪个动作,能按登录、评论、后台这类接口分档设定。判断顺序是先看被刷的是哪一类接口——被刷的是全站页面就用网关层,被刷的是特定业务动作就要在程序层按动作限。

两层限速各自拦什么

网关层的限速维度是地址:以来源地址为键统计速率,超出即拒。它不看这个请求属于哪个业务,也不管调用方是否登录,好处是不消耗应用资源,坏处是同一出口地址下的正常用户会被一起限住。程序层的限速能读到身份与动作,可以对同一个地址分别设定搜索、留言、后台登录的阈值,代价是每个请求都先进了程序才开始计数。官方口径里这类站点的加载速度与并发承载是相对传统 PHP 系统的优势项,单机可承载约 500 万 PV 的量级——但这属于容量描述,不能替代限速:容量大不等于不该限制异常流量。

速率与突发量这两个参数怎么写

以 nginx 的限速模块为例,规则先声明一个共享内存区,再按维度取键。文档写明速率以每秒请求数(r/s)表示;突发量(burst)默认等于零,也就是超出速率就立刻处理不了。实际写法是速率给出稳定线,burst 给出可以短暂无延迟通过的余量:burst 为零时,任何瞬时抖动都会触发限制,正常用户刷新快一点就可能被拒;给一个不大的 burst,等于允许小段突发。还有一种延迟做法是把超出速率的请求排队而不是直接拒,文档也说明了超出速率的请求会被延迟,直到数量超过最大突发量时才以错误终止。

limit_req_zone $binary_remote_addr zone=api:10m rate=5r/s;
limit_req zone=api burst=10 nodelay;

超限返回哪个错误码

默认情况下被拒绝的请求返回 503,文档的示例配置里用 limit_req_status 来改这个状态码。选择上有讲究:503 表示暂时不可用,配合重试语义清楚,适合限流;429 是专门的请求过多语义,调用方更容易识别为「被限速」而不是「服务坏了」。不建议返回 500,那会把限速和程序故障混在一起,排查时误导方向。站内默认监听 8001 端口,网关在其前面反代时,限速返回码要在网关配置里设定;程序直接对外的形态下,限速逻辑就得由应用自己承担。部署形态决定了这个参数写在哪一份配置里。

哪些接口该限、哪些不该限

接口类型 建议层级 理由 误伤风险
搜索与筛选 网关 + 程序 成本高、易被脚本遍历 低
留言与评论提交 程序 要区分登录与用户组 低
后台登录 程序为主 需按账号与动作判断 低
内容图片与静态资源 慎限 同页多请求,限速会打断加载 高
正常页面 宽松 影响用户体验与抓取 高

不该限的是静态资源与正常页面浏览:同一个页面会并发请求多份图片与样式,按地址维度过紧会造成页面残缺。抓取工具的地址段也要单独留余量,否则限速会直接影响收录与内容可见性。

常见问题

问:只配网关限速够不够? 答:被刷的是全站流量时够用。针对某个业务接口的刷量,网关按地址维度限不住具体动作,要靠程序层分档。

问:burst 设多大合适? 答:从正常用户的行为出发:允许一小段突发而不排队,取值让正常刷新不被拒即可,没有通用数值。改完要观察被拒比例再调。

问:限速后日志里怎么看是谁被限了? 答:看网关的访问日志中该状态码对应的来源地址聚合,配合限速区的键(默认按来源地址)判断是单个地址还是同出口的群体用户。

相关文章

打开网站返回 502,先查程序还是先查网关这一层

先看这个响应是谁发出的。502 表示作为网关或代理的服务器从上游收到了无效响应,也就是说请求走到了网关、网关试图转发了,问题出在网关到程序这一段;如果网关完全拿不到响应,返回的是 504 那一类。排查按三步:绕过网关直连源站端口,看网关的错误日志,看程序进程与端口监听。部署形态决定了这三步在哪台机器上做。

2026-10-10

不想让页面进搜索结果,是页面里写排除标记还是文件里写排除规则

看要挡的是抓取还是索引。文件里的排除规则拦的是抓取,页面进不去就读不到内容;页面里的排除标记拦的是索引,前提是抓取方能读到这个页面。只写文件排除规则并不等于不被收录:被屏蔽的页面如果有别处指向它的外链,仍可能因为链接信息被收入索引。要确保不出现,用页面级标记并保证它能被抓取读到;站内robots 配置负责文件层面的抓取控制,两者是配合关系。

2026-10-10

拦不拦 AI 抓取,是写在排除规则里还是另开一道口子

控制 AI 类抓取程序时,Robots 排除规则表达的是意图而不是强制:它按路径与程序标识下发,靠抓取方自觉遵守,管不到已经被外链带出的地址,也不是访问控制。需要强制时收口要落在服务端鉴权与路径不可公开读取上;防止内容被整段搬走另有干扰码与防采集这一层,三件事不要混成一层。

2026-10-09

模型说明文件里标注为可选的那一段,什么时候真的会被跳过

面向大模型的站点说明文件里,只有写站点名称的那一行是必需的,其余段落都允许省略;条目行由必需的链接加可选的冒号后说明组成。标注为可选的段落是给读取方在上下文不够长时让路的,被跳过时损失的是次要信息,不是主干入口,因此主干链接要放在非可选段落里,站内这份文件由内容模块自动生成并保持同步。

2026-10-09

子站和分站要不要各自放一份密钥文件,推送时归属怎么算

多站点做链接主动推送时,密钥文件证明的是主机归属而不是站点品牌:公开提交通道把每个子域视为独立主机,要求分别为每个子域创建和管理单独的密钥文件,放置位置是站点根目录或同一主机上可公开访问的文件夹。因此子站各放一份、按主机核对可访问性,共用一份会在归属校验这一步失败。

2026-10-09

主动推送一次能提交多少条地址,两个通道给的数为什么不一样

主动推送的单次条数上限在不同通道之间差别很大,原因是两个数回答的不是同一个问题:一条通道给的是单次请求能装多少条地址,另一条给的是每次提交操作的上限并叠加按账号浮动的每日额度。量纲不同就不能直接比大小。批量提交要按通道能力切批排队,而不是把整站地址一次塞进一个请求。

2026-10-09

安全版本发布后为什么会强制自动更新,而不是等管理员手动升级

官方对高危安全版本启用强制自动更新,是因为修复窗口不能指望每个站点的管理员同时在线:漏洞公开后,从补丁发布到被批量利用之间往往只剩很短的间隔,把节奏交给个人决策会让大量站点停在没有防护的版本上。强制更新解决的是覆盖面,不等于修复完成——升级前要留备份,升级后还要按公告轮换服务端密钥、修改管理员口令。

2026-10-09

上传目录为什么要去掉脚本执行权限,在哪一层挡

因为上传目录里的文件内容来自访客,路径却是服务器可读可访问的位置。去掉脚本执行权限的意义是:即使有脚本文件被写进来,它也只会作为静态内容返回,不会被当作程序运行。这类限制更适合在 Web 服务器配置里按路径单独匹配来做,规则是前缀取最长、正则按出现顺序首个命中,因此要给上传目录写一条能稳定命中的配置。改完后核对备份,避免误伤正常附件访问。

2026-10-10