如何将VKProxy的CORS设置和HTTP响应缓存优化为?
摘要:VKProxy 是使用c#开发的基于 Kestrel 实现 L4L7的代理(感兴趣的同学烦请点个github小赞赞呢) 目前新添加了如下功能 http响应缓存 Memory Disk Redis CORS设置 log 配置随机概率采样 A
VKProxy 是使用c#开发的基于 Kestrel 实现 L4/L7的代理(感兴趣的同学烦请点个github小赞赞呢)
目前新添加了如下功能
http响应缓存
Memory
Disk
Redis
CORS设置
log 配置随机概率采样
A/B 测试和滚动升级
http响应缓存
响应缓存可减少客户端或代理对 Web 服务器发出的请求数。 响应缓存还减少了 Web 服务器为生成响应而执行的工作量。 响应缓存在标头中设置。
客户端和中间代理应遵循 RFC 9111:HTTP 缓存下缓存响应的标头。
目前暂时内置只内存缓存,不过可以通过扩展接口扩展
缓存条件
请求条件
默认条件
请求方法必须是 GET 或 HEAD。
不能出现 Authorization 标头。
不能存在 Cache-Control: no-cache 或 Pragma: no-cache
不能存在 Cache-Control: no-store
自定义条件
可以通过在Metadata中设置 CacheWhen 自定义条件(一旦设置,默认条件将不起作用), 格式参见 如何为HTTP配置路由复杂匹配
不过依然不能存在 Cache-Control: no-store,避免缓存错误时无法处理
响应条件
缓存协商条件
请求必须生成带有 200 (OK) 状态代码的服务器响应。
不能出现 Set-Cookie 标头。
Cache-Control 标头参数必须是有效的,并且必须将响应标记为 public 而不是 private。
不能存在 Cache-Control: no-store
不能存在 Cache-Control: no-cache
Vary 标头参数必须有效且不等于 *。
Content-Length 标头值(若已设置)必须与响应正文的大小匹配。
根据 Expires 标头与 max-age 和 s-maxage 缓存指令所指定,响应不能过时。
响应缓冲必须成功。 响应的大小必须小于配置的或默认的 SizeLimit。 响应的正文大小必须小于配置的或默认的 MaximumBodySize。
响应必须可根据 RFC 9111:HTTP 缓存进行缓存。 例如,no-store 指令不能出现在请求头或响应头字段中。 有关详细信息,请参阅 RFC 9111:HTTP 缓存(第 3 节“在缓存中存储响应”)。
强制缓存
可以通过在Metadata中设置 ForceCache 为 true 忽略响应缓存条件标准,不过程序如果遵从响应缓存协商标准还是使用标准最好,以免缓存错误
强制缓存条件下,只有以下限制:
请求必须生成带有 200 (OK) 状态代码的服务器响应。
不能出现 Set-Cookie 标头。
缓存设置
大家可以在Metadata中设置缓存, 具体设置项如下
Cache
缓存方式, 内置缓存有 (还可以通过扩展接口扩展,然后大家在此设置)
Memory
基于 MemoryCache 实现
Disk
缓存会实际存于磁盘物理文件
Redis
启用 Redis 情况还可以缓存导redis中
CacheWhen
设置自定义条件(一旦设置,默认条件将不起作用,不设置则使用默认条件), 格式参见 如何为HTTP配置路由复杂匹配
CacheKey
通过内置“简略版模板引擎”,大家可以灵活设置缓存key,如 "CacheKey": "{Method}_{Path}" 效果等同于 $"{RouteKey}#{Method}_{Path}", 值结果可为 Route1#GET_/FAQ
具体设置内容后文详细说明,当然如模板效果不够,大家还可以通过扩展替换引入真正更为强大的模板引擎
CacheMaximumBodySize
可以设置允许缓存Body的最大大小,超过则不会缓存,默认 64 * 1024 * 1024 ,即 64MB
ForceCache
设置 ForceCache 为 true 忽略响应缓存条件标准,不过程序如果遵从响应缓存协商标准还是使用标准最好,以免缓存错误
强制缓存条件下,只有以下限制:
请求必须生成带有 200 (OK) 状态代码的服务器响应。
不能出现 Set-Cookie 标头。
