在 OpenResty Edge 中限制请求速率(使用自定义键)
今天我将演示 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 的并发级别。
运行!请注意,有很多被拒绝的请求都有错误的回应。
这次的请求速率很高,只是因为服务器拒绝那些过度请求的速度非常快。
限制 SSL 握手的速率
除了限制请求速率,OpenResty Edge 还可以限制 HTTPS 请求的 SSL 或 TLS 握手的速率。
在这个页面,我们可以配置限制 SSL 握手的速率。
让我们打开开关,看看配置参数。
这些参数与请求速率限制功能相同。
如果你喜欢这个教程,请订阅这个博客网站和我们的 YouTube 频道 或 B 站频道。谢谢!
关于作者
章亦春是开源 OpenResty® 项目创始人兼 OpenResty Inc. 公司 CEO 和创始人。
章亦春(Github ID: agentzh),生于中国江苏,现定居美国湾区。他是中国早期开源技术和文化的倡导者和领军人物,曾供职于多家国际知名的高科技企业,如 Cloudflare、雅虎、阿里巴巴, 是 “边缘计算“、”动态追踪 “和 “机器编程 “的先驱,拥有超过 22 年的编程及 16 年的开源经验。作为拥有超过 4000 万全球域名用户的开源项目的领导者。他基于其 OpenResty® 开源项目打造的高科技企业 OpenResty Inc. 位于美国硅谷中心。其主打的两个产品 OpenResty XRay(利用动态追踪技术的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最适合微服务和分布式流量的全能型网关软件),广受全球众多上市及大型企业青睐。在 OpenResty 以外,章亦春为多个开源项目贡献了累计超过百万行代码,其中包括,Linux 内核、Nginx、LuaJIT、GDB、SystemTap、LLVM、Perl 等,并编写过 60 多个开源软件库。
关注我们
如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版原文和中译版(本文) 。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!