限制单位时间内的请求数

页面规则的下拉列表里面有很多动作,我们从中选择 “限制请求动作” 类别中的 限制请求数, 它是用来控制指定时间段内的请求数量.

前面限制请求速率是从请求速度方面来做限制,而限制请求数是从总的请求数上做限制。 限制请求数有三个参数:

  1. 关键字: 默认是按照终端的 IP 地址作为 key 来计数;
  2. 拒绝于: 如果区间内的请求超过这个值,就会返回给终端 503 错误;
  3. 时间窗口: 计数的时间区间,单位是秒。进入下一个区间时,计数会被清零,开始新的计数。

以这个设置为例,含义是在每一个 60 秒内,如果有某个终端的请求超过 1 个,就返回 503 错误。

这个规则我们不开启条件,直接点击右下方的创建按钮。

那么这个限制规则到底生效没有呢?我们来验证下。

我们首先要进入 发布 页面,把这个规则同步到所有网关的节点中去。

如果发布可以查看发布,这里不再赘述。

然后再打开 shell 来模拟客户端的访问。

我们的第一次访问不会被限制,返回了 404, 因为这个页面并不存在。

$ curl -i -H 'host: rewrite-rule-test.com' endawshk100.dev.openresty.com/404.html
HTTP/1.1 404 Not Found
Date: Fri, 04 Sep 2020 04:43:20 GMT
Content-Type: text/html
Content-Length: 150
Connection: keep-alive
Server: openresty+

<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>openresty</center>
</body>
</html>

同样的请求,我们再次发送一次,看看是否会如预期中的返回 503:

$ curl -i -H 'host: rewrite-rule-test.com' endawshk100.dev.openresty.com/404.html
HTTP/1.1 503 Service Temporarily Unavailable
Date: Fri, 04 Sep 2020 04:43:21 GMT
Content-Type: text/html
Content-Length: 194
Connection: keep-alive
Server: openresty+

<html>
<head><title>503 Service Temporarily Unavailable</title></head>
<body>
<center><h1>503 Service Temporarily Unavailable</h1></center>
<hr><center>openresty</center>
</body>
</html>

不出所料,第二次请求返回了 503 错误,这表示我们上面的规则生效了。