kangle关于 cdn 缓存的几种坑,随机多域名固定重写共用
因为 “缓存是按 URL(通常包含 Host)分桶的”。我现在的域名是 * 泛解析 通配符的,前端每次刷新,可能请求资源的域名是 1.test.com 2.test.com 3.test.com 这种随机的二级主机域名
在 CDN/Kangle 眼里,这就是一条全新的 URL 空间,所以第一次一定是 MISS,第二次(同一个子域名再访问)才会 HIT。你刚才 curl 两次就验证了这一点:第一次 MISS,第二次 HIT。
同时还有两个“必然一起发生”的点:
1) CDN/Kangle 的缓存 key 通常包含 Host
大多数缓存默认是:cache_key = scheme + host + uri (+ query)
所以:
https://a.xxx.com/path/poster2.jpg 和
https://b.xxx.com/path/poster2.jpg
哪怕回源同一份文件,也会被当成两份不同缓存对象。
2) 浏览器缓存也不跨域复用
就算文件内容完全一样,换子域名后浏览器也会当成新站点资源,不会直接复用之前域名的本地缓存(同源策略的直觉结果)。
你想要“换子域名也不 MISS”,只有这几种路
方案 A(最稳、最省事):别换子域名,用一个固定静态域名
比如只用:
img.ydyimgsbafa134.sbs/...
然后你想怎么更新内容就更新内容,缓存命中会稳定很多。
方案 B:让所有子域名 301 到一个固定域名
用户访问任意 *.sbs 最终都跳到 img.xxx.sbs,缓存也就集中起来了。
方案 C(有风险):在 Kangle/CDN 里把缓存 key 改成“不包含 Host”
这样不同子域名会共享同一份缓存。
✅ 命中率会飙升
⚠️ 风险是:如果不同子域名未来可能出现“同路径不同内容”,会串缓存(非常坑)
方案 D:预热(warm up)
你每生成一个新子域名,就脚本 curl 一遍热门资源,把它“主动打热”,用户看到的就会更少 MISS。
===================
问题来了
如何 在 Kangle/CDN 里把缓存 key 改成“不包含 Host”
因为一台cdn节点 使用了 3个不同的根域名缓存了不同的源服务器的资料
怎样配置kangle规则呢
实下如下例子
---------------
站1的资源url
1.z1.com/xxx/x.gif
2.z1.com/xxx/x.gif
3.z1.com/xxx/x.gif
无限随机
-----------
1.z2.com/xxx/x.gif
2.z2.com/xxx/x.gif
3.z2.com/xxx/x.gif
同上
-----------
1.z3.com/xxx/x.gif
2.z3.com/xxx/x.gif
3.z3.com/xxx/x.gif
同上 和你咨询ai说的一样
kangle能够实现的是请求控制中的remove_param标记模块,用于删除?之后的参数
例如你提到的方案改成如下
www.z1.com/xxx/x.gif?host=1
www.z1.com/xxx/x.gif?host=3
www.z1.com/xxx/x.gif?host=3
同时就算通过上方删除参数的形式hit缓存了,浏览器用户本地端也不会认可这种缓存,会反复重复请求服务器去获取新资源
还有一种可行的思路提供
使用url_rewrite标记模块重写
匹配url
+\.z1\.com/(.*)$
重写dst
https://att.z1.com/$1
重写结果如下,这样服务器会始终hit到att的缓存,并且浏览器也会始终认可这个缓存结果无需和服务器进行后续请求
1.z1.com/forum/data/image.jpg → att.z1.com/forum/data/image.jpg
2.z1.com/avatar/001.gif → att.z1.com/avatar/001.gif
3.z1.com/static/css/style.css → att.z1.com/static/css/style.css
最后一种未测试的思路,理论上是可以的
url_rewrite标记模块目标code不使用301,把值改为0,代表在kangle内部完成重写在输出,用户不可见这个过程,等于说无感知实现重写
kangle会主动发起请求到att域名上,然后由于att已经hit命中缓存,此时无需回源,需要确保匹配url填写正确,否则会发生死循环无限跳转的现象
使用这个方案服务器虽然hit缓存,但是浏览器不认可这种缓存,会反复请求服务器
我帮你改了下标题,加了几个关键词方便搜索
看得懂上面的字面意思,但是kangle面板如何配置,我无从下手。
可以截图配置参数的键和值吗
谢谢 樱大
页:
[1]