有什么把 ASP.NET Core MVC 写的企业官网所有页面渲染成静态的吗?最近经常有 CC 攻击把 CPU 占满。或者 Nginx 配什么参数能把所有页面都缓存下来?(内容非常少变动,没有用户可以提交的内容)

2023-01-15 21:18:32 +08:00
 edis0n0
2073 次点击
所在节点    程序员
24 条回复
xioxu
2023-01-16 17:02:41 +08:00
自己写一个 Filter ,自行控制过期、缓存逻辑。
xioxu
2023-01-16 17:09:31 +08:00
这是 chatGPT 生成的示例代码:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

public class CacheFilter : IActionFilter
{
private static ConcurrentDictionary<string, byte[]> _cache = new ConcurrentDictionary<string, byte[]>();

public void OnActionExecuted(ActionExecutedContext context)
{
if (context.Result is FileResult)
{
// 缓存 FileResult 类型的结果
var file = context.Result as FileResult;
using (var stream = new MemoryStream())
{
file.CopyTo(stream);
var key = $"{context.HttpContext.Request.Path}{context.HttpContext.Request.QueryString}";
_cache.TryAdd(key, stream.ToArray());
}
}
}

public void OnActionExecuting(ActionExecutingContext context)
{
var key = $"{context.HttpContext.Request.Path}{context.HttpContext.Request.QueryString}";
if (_cache.TryGetValue(key, out var data))
{
// 如果缓存中有,则直接返回
context.Result = new FileContentResult(data, "application/octet-stream");
}
}
}
sky857412
2023-01-17 09:51:03 +08:00
不是有个名词叫静态化,ASP.NET Core MVC 静态化 搜索下
zimrigeek
2023-01-17 17:17:41 +08:00
面对攻击 最有效的解决方案一般 2 大类,1 是从 Web Server 端限制流量,2 是从 CDN 限制流量
1. Web Server 端限制流量
无论是 nginx 还是 openresty 均有相关模块可以直接调用

nginx.conf

http{
...
# 防止 CC 攻击配置;
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
...
}


vhost.conf

server{
...
# 并发限制;
limit_conn perserver 500;
limit_conn perip 50;
limit_rate 5120k;
# 并发限制-END
...
}


2. CDN 一般因厂商而异,通过流量、CC 控制相应功能 来限制

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/909129

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX