限制请求速率

限制请求速率动作基于漏桶算法控制请求处理速度。低于调节阈值的请求正常处理;速率进入调节区间后,请求会被延迟;达到拒绝阈值后,系统执行指定的拒绝动作。

适用场景

  • 平滑突发流量,避免短时间内的大量请求压垮上游服务。
  • 限制爬虫、接口轮询、批量查询等持续高频访问。
  • 按客户端、URI 或业务标识分别保护高成本接口。

如果需要限制固定时间窗口内的请求总数,而不需要对中间流量进行延迟,请使用限制请求数

工作原理

OpenResty Edge 根据一个或多个关键字对请求分组,并分别计算每个分组的请求速率。漏桶算法将进入调节区间的突发请求延迟处理,使输出速率更加平稳;超过拒绝阈值的请求则执行拒绝动作。

配置方法

在目标应用的页面规则中选择 CC 攻击防御动作 > 限制请求速率

选择限制请求速率动作

限制请求速率配置

参数说明

  1. 关键字:用于对请求分组并分别计算速率。默认使用客户端 IP 地址,也可以组合 URI、URI 参数等关键字。选择 URI 参数或 Cookie 时,还需要指定相应的参数或 Cookie 名称。详见关键字
  2. 调节于:请求速率低于该值时不受限制;达到该值但尚未达到拒绝阈值时,请求将被延迟处理。
  3. 拒绝于:请求速率达到该值后,系统执行拒绝动作。
  4. 拒绝动作:达到拒绝条件后执行的操作。详见拒绝动作

调节阈值和拒绝阈值可以按每秒请求数或每分钟请求数设置。两个阈值设置为相同值时,不保留调节区间,达到该速率后将直接执行拒绝动作。

关键字

限制请求速率的关键字选项

可选的关键字包括:

  • 客户端 IP 地址:例如 1.1.1.1
  • URI:例如 /openresty
  • URI 查询参数:例如 /openresty?arg1=val1 中的 arg1
  • 请求 Cookie:例如 Cookie: c1=v1 中的 c1
  • X-Forwarded-For 中的第一个 IP 地址:例如 X-Forwarded-For: 1.1.1.1, 1.1.1.2 中的 1.1.1.1
  • X-Forwarded-For 中的最后一个 IP 地址:例如 X-Forwarded-For: 1.1.1.1, 1.1.1.2 中的 1.1.1.2
  • 指定的 HTTP 请求头:例如 Host
  • 加密 Cookie:根据 OpenResty Edge 生成的加密 Cookie 区分客户端。请求没有携带加密 Cookie 时,系统需要回退到其他关键字,因此加密 Cookie 必须与其他关键字组合使用

使用 X-Forwarded-For 前,应确保该请求头由可信代理维护,不能由客户端任意伪造。

拒绝动作

达到拒绝条件后,系统可以执行以下预设动作。默认动作为 返回错误页

限制请求速率的拒绝动作

  • 关闭请求连接:立即终止与客户端的连接,不再响应请求。
  • 返回错误页:返回错误页面,默认状态码为 503。
  • 完成 hCaptcha 验证:要求客户端通过 hCaptcha 挑战。
  • 完成 OpenResty Edge Captcha 验证:使用 OpenResty Edge 的验证码系统验证用户。
  • 重定向验证:将请求重定向到验证页面,验证通过后才能继续访问。
  • JavaScript 挑战:要求客户端浏览器执行 JavaScript 代码,以区分浏览器和简单的自动化程序。
  • 私有访问 Token:请求客户端认证,没有有效 Token 时执行配置的回退动作。 需要配置回退动作、必要的 页面模板 和 清除时间(默认 60 秒)。详见 私有访问 Token。 此动作在 OpenResty Edge 26.9.1-1 中首次引入。
  • 标记为拒绝:仅将请求标记为拒绝,并继续执行后续规则。此动作于 24.9.1-7 中首次引入。
  • 封禁 IP 地址:在操作系统层面丢弃来源 IP 的所有数据包。此动作于 26.3.1-1 中首次引入。

配置示例

仅限制特定地区的请求

默认情况下,动作会对所有请求按客户端 IP 地址计算速率。可以通过页面规则条件缩小生效范围。例如,将客户端国家设置为 JP,可以仅对来自日本的请求执行该动作。

按客户端国家限制请求速率

完成动作和条件设置后,创建规则并发布应用配置。

创建请求速率限制规则

加密 Cookie 应与其他关键字组合使用。以下配置同时选择 客户端 IP 地址加密 Cookie,并将调节阈值和拒绝阈值设置为每分钟 1 个请求。

使用加密 Cookie 作为关键字

保存并发布配置:

发布请求速率限制配置

第一次发送测试请求时,请求尚未携带加密 Cookie,因此响应会通过 Set-Cookie 下发 _oredge_rl

$ curl localhost -H 'Host: test.com' -I
HTTP/1.1 404 Not Found
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: _oredge_rl=G63GyXMjH89ClH7dgJgSAo+f7FbPVTD5KAdkLbnkjhw=; Path=/; Secure
Req-ID: 0000008000045ed343300002

携带该 Cookie 发送第一个请求时,加密 Cookie 对应的计数尚未达到限制:

$ curl localhost -H 'Host: test.com' -I \
    -H 'Cookie: _oredge_rl=G63GyXMjH89ClH7dgJgSAo+f7FbPVTD5KAdkLbnkjhw='
HTTP/1.1 404 Not Found
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Req-ID: 0000008000045ed343300003

在同一分钟内再次携带相同 Cookie 发送请求,将触发限制并返回 503:

$ curl localhost -H 'Host: test.com' -I \
    -H 'Cookie: _oredge_rl=G63GyXMjH89ClH7dgJgSAo+f7FbPVTD5KAdkLbnkjhw='
HTTP/1.1 503 Service Temporarily Unavailable
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Req-ID: 0000008000045ed343a80004

注意事项

  • 阈值应高于正常业务峰值,并通过监控逐步调整。阈值过低会使正常突发请求进入延迟队列或被拒绝。
  • 组合关键字会改变统计粒度。只按 URI 统计会让所有客户端共享同一个速率额度;按“客户端 IP 地址 + URI”统计则会为每个客户端访问每个 URI 分别计速。
  • 只按客户端 IP 地址计速时,共享 NAT 或代理后的用户会共用额度。
  • 验证配置时,应分别测试低于调节阈值、进入调节区间、达到拒绝阈值和速率恢复后的行为。