现象
实际现象并不是页面直接报 503,而是一个用 vuejs 开发的在线二维码生成工具,后台是 asp.net core。 偶尔会出现 vue 变量不渲染的情况,而且我印象中,一个周遇到 3 次了。
今天在使用这个页面时,又遇到了。不能再拖延了,现在动手排查一下。
从浏览器的调试窗口中,可以看到实际上是在加载一个 js 文件时,报了 503 错误。 我们知道 HTTP 503 状态码代表:
服务器过载:当服务器接收到的请求量超过其处理能力时,可能会返回 HTTP 503 错误
通常是进行了请求限速之后,会触发这个错误。因为大家一般不使用 429 来直接提示请求过多。
惯性思维
因为这个网站一直没有遇到过 503 错误,只有在使用 asp.net 之后才第一次遇到。 所以,我就直接以为是 asp.net 默认开启了 rate limiting middleware。
而实际上并不是这个原因。
根本原因是,最近 staticfile CDN 出问题,被 adblock 拉入了黑名单,不得以,我把常用的 css, js 文件都放到了服务器本地。 于是,打开一个页面,就会瞬间向我服务器发起近 10 个请求。触发了 Nginx 之前配置的限速规则。
Nginx 限速配置
limit_req_zone $binary_remote_addr zone=one:10m rate=8r/s;
limit_req zone=one burst=5;
参考:之前整理的 如何限制恶意用户刷站 - Nginx 限速规则
即,同一 IP 每秒超过 8 个请求,就进行限速,报 503 错误。
于是,把这个阈值调高到了 12 次/每秒。
limit_req_zone $binary_remote_addr zone=one:10m rate=12r/s;
Rate limiting middleware 是默认启用的么
浏览了一下官方的文档:
https://learn.microsoft.com/en-us/aspnet/core/performance/rate-limit?view=aspnetcore-8.0
并没有发现默认会开启的说法。而且 Program.cs 入口文件中也没有相关的配置。
搜索了一下代码,也没有。虽然编译后的文件中会包含相关的关键字:
> grep RateLimit -r ./
Binary file ./bin/Debug/net8.0/dotnet_tool.pdb matches
Binary file ./bin/Release/net8.0/dotnet_tool.pdb matches
Binary file ./bin/Release/net8.0/publish/dotnet_tool.pdb matches
Binary file ./obj/Debug/net8.0/dotnet_tool.pdb matches
Binary file ./obj/Release/net8.0/dotnet_tool.pdb matches
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式