怎么判断出现回源了(未命中的情况)
命中低的表现:
请求加速域名下对应的资源,通过浏览器工具查看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配置成功且添加预热情况下,命中不到,引起回源。
例如:
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还是需要预热或刷新同步资源。
网友评论