今天我将演示 OpenResty Edge 的另一个功能:通过自定义键来限制请求率。

嵌入图片

有时客户端发送请求的速度太快,比如在拒绝服务攻击下。在这种情况下,我们应该限制请求率,以保护网关服务器和源服务器。否则,服务器可能会过载。

让我们进入 OpenResty Edge 的 Admin Web 控制台。这是我们控制台的样本部署。每个用户都有自己的本地部署。

屏幕截图

我们可以继续使用之前的示例应用,test-edge.com。

屏幕截图

进入该应用程序。

屏幕截图

我们已经定义了一个页面规则。

屏幕截图

这个页面规则设置了一个反向代理,这个反向代理将请求转发到一个预先定义的上游,此时并没有限制请求速率。

屏幕截图

现在让我们编辑现有的页面规则,添加速率限制。

屏幕截图

添加一个新的动作。

屏幕截图

你可以在这里搜索你想添加的动作。

屏幕截图

搜索 “Limit request rate”。

屏幕截图

选择这个动作。

屏幕截图

首先,我们需要指定速率限制的 Key。

屏幕截图

可以看到有多种 Key 类型可选,比如客户端的 IP 地址、URI、URI 参数、cookie,以及更多。

现在先选择默认的 Key 类型,客户端 IP 地址。意思是针对每个单独的客户端 IP 地址进行限制。

屏幕截图

“Shape at” 速率是一个软限制。当客户端试图发送比这个速率更快的请求时,网关服务器将延迟这些过度的请求以匹配这个速率。因此,客户端发送请求的速度越快,网关将为请求添加更长的延迟。

屏幕截图

这里我们指定每秒 50 个请求的速率。

屏幕截图

因为指定了 Key 为客户端 IP 地址,所以限制将被应用于每个单独的客户端 IP 地址。

“Reject at” 速率是一个硬限制。当客户端发送请求的速度快到超过这个硬限制时,我们可以采取更积极的行动,比如立即阻止他们,而不用等待。

屏幕截图

在这里指定每秒 100 个请求的速率。

屏幕截图

然后可以选择不同的拦截动作。

屏幕截图

比如立即关闭当前连接,返回错误页面,或者返回验证码页面来阻止机器人。

默认的“错误页面”动作,将通过 HTTP 返回一个错误页面。

屏幕截图

此处使用默认的 HTTP 状态代码,503,表示服务不可用。

屏幕截图

保存修改。

屏幕截图

像往常一样,我们需要发布来推送这个新改动。

屏幕截图

点击这个按钮。

屏幕截图

发布!

屏幕截图

改动已经同步到所有的网关服务器。

屏幕截图

现在,新的页面规则已经被推送到所有的网关集群和服务器。

我们的配置变化不需要服务器重载、重启或二进制升级。所以它是非常有效和可扩展的。

嵌入图片

接下来,我们将验证新速率限制的效果。

在终端上,我们可以通过名为 wrk 的开源工具,非常快速地发送大量的请求。

wrk -c 50 -d 1s http://test-edge.com/

这里我们首先使用 50 的并发级别,注意 -c 选项。

屏幕截图

运行该命令,实际请求率约为每秒 50 个请求。

屏幕截图

然后我们提高并发级别,使 wrk 发送请求的速度更快。

注意 128 的并发级别。

屏幕截图 5

运行!请注意,有很多被拒绝的请求都有错误的回应。

截图 7

这次的请求速率很高,只是因为服务器拒绝那些过度请求的速度非常快。

截图 8

除了限制请求速率,OpenResty Edge 还可以限制 HTTPS 请求的 SSL 或 TLS 握手的速率。

屏幕截图

在这个页面,我们可以配置限制 SSL 握手的速率。

屏幕截图

让我们打开开关,看看配置参数。

屏幕截图

这些参数与请求速率限制功能相同。

屏幕截图

如果你喜欢这个教程,请订阅这个博客网站和我们的 YouTube 频道B 站频道。谢谢!

关于本文和关联视频

本文和相关联的视频都是完全由我们的 OpenResty Showman 产品从一个简单的剧本文件自动生成的。

关于作者

章亦春是开源项目 OpenResty® 的创始人,同时也是 OpenResty Inc. 公司的创始人和 CEO。他贡献了许多 Nginx 的第三方模块,相当多 Nginx 和 LuaJIT 核心补丁,并且设计了 OpenResty XRayOpenResty EdgeOpenResty Showman 等产品。

关注我们

如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:

我们的微信公众号

翻译

我们提供了英文版原文和中译版(本文) 。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!