我正在将我们的 Web 应用程序的部署从 Azure 应用服务更改为应用程序网关后面的虚拟机,因为应用服务无法处理几天前的峰值负载。
我现在想做的是保护应用程序免受可能出现的非常短暂的峰值使用的影响,即实施速率限制(例如每个客户端/IP 每分钟最多 60 个请求)。
预计该应用的峰值使用时间会非常短(售票应用开始销售非常受欢迎的活动)。
上次出现峰值时,服务器变慢了,人们开始尽可能快地点击“刷新”,结果完全关闭了整个系统,没有机会恢复(每秒有数千个请求,我们的系统无法重新启动,因为它的设计并不是为了如此高的负载,因为在 99.9% 的时间里,我们每秒的请求数不到 100 个)——所以我们希望能够避免此类用户“意外或因为害怕拿不到票”而对系统进行“DDoS 攻击”……
使用应用程序网关可以实现这一点吗?
还有其他想法可以如何实现这种(按需)速率限制吗?
我发现以下内容:https://docs.microsoft.com/en-us/azure/api-management/api-management-sample-flexible-throttling 但这似乎不适用于应用程序网关,或者至少我没有发现如何......
答案1
Azure 应用程序网关中没有本机机制来应用速率限制。
可能最简单的就是查看 Azure Front Door 服务:
https://docs.microsoft.com/en-us/azure/frontdoor/front-door-overview
具体来说,客户端速率限制 WAF 规则:
https://docs.microsoft.com/en-us/azure/frontdoor/waf-overview#waf-rules
请注意,这将根据特定的客户端 IP 来限制速率,如果您拥有一系列客户端,它不一定会对您有所帮助。
请注意,FrontDoor 的后端池可以是任何主机名,因此它可以是一组虚拟机,或者您可以拥有一个简单的 Azure 负载均衡器,可以将其用作端点。不过,我不建议在此设置中使用 Azure 应用程序网关,因为它会重复 Front Door 中的功能,而且成本是基本 Azure 负载均衡器所没有的。
我的建议是查看虚拟机规模集 (VMSS),并将其用作根据需求自动扩展的机制。这样,您可以对单个客户端 IP 进行速率限制(防止刷新按钮堵塞),还可以根据合法的客户端数量扩展您的应用程序 - 之后再缩减规模以节省成本。参见:
https://docs.microsoft.com/en-us/azure/virtual-machine-scale-sets/overview
最后,您引用的链接是 Azure API Management 的一部分,这是一个专门用于构建和公开复杂 API 平台的平台。虽然您可以使用该服务实现一系列流量处理选项,但它可能不是您在这种情况下想要的,因为它是一个更全面的企业 API 管理平台,具有您不需要的一系列功能。
更新:虽然我可以轻松地添加一些 URL,但实际上并没有很好的记录如何将策略应用于 Azure Front Door 来实现您想要实现的目标。
因此,这里有一些在 PowerShell 中尝试的步骤 - 注意它可能不完全是你想要的,但它应该可以帮助你入门(使用新的 Az.Frontdoor 模块):
首先我们创建一个匹配条件,这里我匹配任何 IP 地址(尽管如果你愿意,你可以构建 IP 范围特定的条件):
$mc = New-AzFrontDoorMatchConditionObject -MatchVariable RemoteAddr -OperatorProperty Any
接下来,我们创建一个自定义速率限制规则,该规则将匹配任何匹配条件,并且如果它在 1 分钟内看到超过 10 个满足该条件的请求,它将阻止这些请求 1 分钟(我思考- 这是一项非常新的服务,文档不是很清楚,这是我从一些实验中发现的):
$cr = New-AzFrontDoorCustomRuleObject -Name MyRule1 -RuleType RateLimitRule -MatchCondition $mc -Action Block -RateLimitThreshold 10 -RateLimitDurationInMinutes 1 -Priority 10
然后我们仅使用单个自定义规则创建 WAF 策略:
$policy = New-AzFrontDoorFireWallPolicy -ResourceGroupName AD -Name MyPolicy -Customrule $cr -EnabledState Enabled -Mode Prevention
然后我们将其附加到我们的 Front Door 实例(分别将 TestRG 和 TestFD 替换为资源组和 Front Door 实例的名称):
$fd = Get-AzFrontDoor -ResourceGroupName TestRG -Name TestFD
$fd[0].FrontendEndpoints[0].WebApplicationFirewallPolicyLink = $policy.Id
Set-AzFrontDoor -InputObject $fd[0]
希望这能帮助您入门,正如我所说,速率限制实际上是如何执行的似乎有点不清楚。如果我找到更多详细信息 - 或者其他人有详细信息,我很乐意再次更新答案。
我用来构建它的参考资料是 Az.Frontdoor 文档:
https://docs.microsoft.com/en-us/powershell/module/az.frontdoor/?view=azps-1.6.0
答案2
你可以把你的网页应用放在后面亚太地区管理协会并使用IP地址限制策略。
例如,以下策略限制单个客户端 IP 地址每分钟只能进行 10 次呼叫:
<rate-limit-by-key calls="10"
renewal-period="60"
counter-key="@(context.Request.IpAddress)" />