限制单位时间内的请求数

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

限制单位时间内的请求数 - 图1

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

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

限制单位时间内的请求数 - 图2

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

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

限制单位时间内的请求数 - 图3

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

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

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

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

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

  1. $ curl -i -H 'host: rewrite-rule-test.com' endawshk100.dev.openresty.com/404.html
  2. HTTP/1.1 404 Not Found
  3. Date: Fri, 04 Sep 2020 04:43:20 GMT
  4. Content-Type: text/html
  5. Content-Length: 150
  6. Connection: keep-alive
  7. Server: openresty+
  8. <html>
  9. <head><title>404 Not Found</title></head>
  10. <body>
  11. <center><h1>404 Not Found</h1></center>
  12. <hr><center>openresty</center>
  13. </body>
  14. </html>

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

  1. $ curl -i -H 'host: rewrite-rule-test.com' endawshk100.dev.openresty.com/404.html
  2. HTTP/1.1 503 Service Temporarily Unavailable
  3. Date: Fri, 04 Sep 2020 04:43:21 GMT
  4. Content-Type: text/html
  5. Content-Length: 194
  6. Connection: keep-alive
  7. Server: openresty+
  8. <html>
  9. <head><title>503 Service Temporarily Unavailable</title></head>
  10. <body>
  11. <center><h1>503 Service Temporarily Unavailable</h1></center>
  12. <hr><center>openresty</center>
  13. </body>
  14. </html>

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