阿里云CDN命中不到的问题

2020-02-22  本文已影响0人  squidbrother
怎么判断出现回源了(未命中的情况)

命中低的表现:
请求加速域名下对应的资源,通过浏览器工具查看network可见

response Headers 中 查看 X-Cache 
出现 MISS 说明未命中
出现 HIT TCP_MEM_HIT 说明命中了,另外 通过Age 可查看该资源在当前cdn节点已缓存了多久
在CDN阶段创建缓存成功后,若出现了回源,如何排查

1.大部分为动态内容
2.URL带参数,每次请求参数变化
3.文件源站设置了 cache-control:np-cache 或者 private 或者 max-age=0

针对上述情况,express静态文件托管最容易发生

因为express静态托管的语法格式为:
express.static(root, [options])
root 参数指的是静态资源文件所在的根目录。
options 对象是可选的,支持以下属性:
其中,options参数中 maxAge Default为0
如果没写options这一块非必选参数,那么会直接导致 CDN配置成功且添加预热情况下,命中不到,引起回源。

express静态托管的官方API地址

例如:

app.use(express.static('public', {
    maxAge:xxxx
}))

其中 maxAge值的单位可以是毫秒数字,也可以是ms格式的字符串
具体格式如下

格式 意思(单位毫秒)
ms('2 days') 172800000
ms('1d') 86400000
ms('10h') 36000000
ms('2.5 hrs') 9000000
ms('2h') 7200000
ms('1m') 60000
ms('5s') 5000
ms('1y') 31557600000
ms('100') 100
ms('-3 days') -259200000
ms('-1h') -3600000
ms('-200') -200
ms(60000) "1m"
ms(2 * 60000) "2m"
ms(-3 * 60000) "-3m"
ms(ms('10 hours')) "10h"

修改完express配置,pm2重启服务器,命中啦~!


缓存成功
命中缓存
针对CDN存在缓存策略,服务器也存在缓存策略,浏览器同样存在缓存策略,它们处理缓存的优先级是怎么样的呢?

初次请求,查看CDN服务器,没有缓存,则去源服务器请求数据,服务器返回数据到CDN,同步到浏览器
浏览器在过期时间内访问 CDN服务器查看其 源服务器设置缓存时间,
没有到,则返回CDN服务器数据
如果到期了,则去源服务器请求数据

Cache-Control 属性与意义

Cache-Control 有几种属性:

private:表示它只应该存在本地缓存
public:表示它既可以存在共享缓存,也可以被存在本地缓存
no-cache:表示不论是本地缓存还是共享缓存,在使用它以前必须用缓存里的值来重新验证
no-store:表示不允许被缓存。
max-age=:设置缓存时间,设置单位为秒。本地缓存和共享缓存都可以
s-maxage=:覆盖 max-age 属性。只在共享缓存中起作用。
immutable:表示文档是不能更改的。
must-revalidate:表示客户端(浏览器)必须检查代理服务器上是否存在,即使它已经本地缓存了也要检查。
proxy-revalidata:表示共享缓存(CDN)必须要检查源是否存在,即使已经有缓存。

服务器缓存与CDN缓存

Cache-Control: public max-age=3600 //本地缓存和 CDN 缓存均缓存 1 小时;
Cache-Control: private immutable   //不能缓存在 CDN,只能缓存在本地。并且一旦被缓存了,则不能被更新;
Cache-Control: no-cache //不能缓存。如果一定要缓存的话,确保对其进行了二次验证;
Cache-Control: public max-age=3600 s-maxage=7200  //本地缓存 1 小时,CDN 上缓存 2 小时;
Cache-Control: public max-age=3600 proxy-revalidate   //本地和 CDN 均缓存 1 小时。但是如果 CDN 收到请求,则尽管已经缓存了 1 小时,还是要检查源中文档是否已经被改变。
最后记得预热你的资源到节点

手动访问加速域名,只是推送数据到离你最近的节点,而不是所有的节点,所以阿里云CDN还是需要预热或刷新同步资源。

上一篇下一篇

猜你喜欢

热点阅读