使用AspNetCoreRateLimit来控制网站并发访问量-博客改造计划【3】
背景
最近在检查后台的时候发现有很多不明IP频繁的扫描博客的后台路径,查了一下IP发现都是国外的IP,可能是被感染的肉鸡对我这个IP段批量进行扫描,虽然说扫站对我的危害性不大,但是扫描太频繁会导致后台带宽占用过高进而导致网站访问缓慢,而且过高的并发也会导致后台服务器崩溃,所以我打算给博客加上并发控制的限制。
AspNetCoreRateLimit
AspNetCoreRateLimit 是一种 ASP.NET Core 速率限制解决方案,旨在控制客户端可以根据 IP 地址或客户端 ID 向 Web API 或 MVC 应用程序发出的请求速率。AspNetCoreRateLimit 包包含一个 IpRateLimitMiddleware 和一个 ClientRateLimitMiddleware,对于每个中间件,您可以为不同的场景设置多个限制,例如允许 IP 或客户端在每秒、15 分钟等时间间隔内进行最大调用次数。您可以定义这些限制来解决对 API 发出的所有请求,或者您可以将限制范围限定为每个 API URL 或 HTTP 动词和路径。
官方网站:
https://github.com/stefanprodan/AspNetCoreRateLimit
使用方法
首先通过Nuget安装AspNetCoreRateLimit
安装完成以后在startup.cs里面进行配置
public void ConfigureServices(IServiceCollection services)
{
// needed to load configuration from appsettings.json
services.AddOptions();
// needed to store rate limit counters and ip rules
services.AddMemoryCache();
//load general configuration from appsettings.json
services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));
//load ip rules from appsettings.json
services.Configure<IpRateLimitPolicies>(Configuration.GetSection("IpRateLimitPolicies"));
// inject counter and rules stores
services.AddInMemoryRateLimiting();
//services.AddDistributedRateLimiting<AsyncKeyLockProcessingStrategy>();
//services.AddDistributedRateLimiting<RedisProcessingStrategy>();
//services.AddRedisRateLimiting();
// Add framework services.
services.AddMvc();
// configuration (resolvers, counter key builders)
services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseIpRateLimiting();
app.UseMvc();
}
在appsettings.json里面设置配置和限制规则
"IpRateLimiting": {
"EnableEndpointRateLimiting": false,
"StackBlockedRequests": false,
"RealIpHeader": "X-Real-IP",
"ClientIdHeader": "X-ClientId",
"HttpStatusCode": 429,
"IpWhitelist": [ "127.0.0.1", "::1/10", "192.168.0.0/24" ],
"GeneralRules": [
{
"Endpoint": "*",
"Period": "1s",
"Limit": 50
}
]
}
我这里是设置了同一个IP最高可以进行1秒50次并发访问,超过就会被系统封到黑名单里面。
验证
为了方便触发限制,我在本地把限制改成了1秒10次并发,并进行验证:
可以看到访问这张图片的时候超过了限制,返回了429
返回的信息也变成了API calls quota exceeded! maximum admitted 10 per 1s. 表面并发超过限制,被系统拦截了。
{{item.content}}
@{{item.nickName}} {{item2.content}}
目录