谈谈CDN
- CDN加速域名,加快域名访问
- CDN静态存储缓存
- OSS上传,也通过自定义CDN加速域名
CDN缓存策略
- 只需要缓存JS、CSS等静态资源
- 禁止缓存
index.html- 如果缓存了
index.html,会导致index.html引用的js、css等静态资源都是旧的,没办法拿到最新的静态资源 - 在源站配置禁止缓存
index.html- 一般是在nginx中配置
- 如果缓存了
- 禁止缓存接口内容数据
- 如果接口内容缓存了,可能会导致用户看到的数据异常
- 用户看到的是缓存的数据,没法看到最新的数据
CDN缓存配置
- 登录CDN管理控制台:进入域名配置页面的“缓存策略”模块。
- 创建排除规则
- 路径匹配:例如
/index.html或/*.html
- 路径匹配:例如
- 创建包含规则
- 扩展名匹配:如
/*.js、/*.css、/*.png。 - 设置缓存时间、启用缓存压缩gzip
- 扩展名匹配:如
CDN缓存问题
缓存哪些文件
只缓存前端的静态资源
- 1、只缓存js、css等静态文件
- 2、不缓存index.html
- 3、不缓存接口数据,避免接口数据缓存,造成每个用户看到的数据都是一样
缓存过期CDN如何处理
- 1、浏览器请求CDN节点资源
- 2、CDN 检查自己缓存是否仍有效
- 有效期内 => CDN 返回缓存内容
- 过期 => CDN 回源(请求源站)并刷新缓存
CDN资源缓存在哪个地方?
是缓存在用户浏览器,还是CDN节点服务器?
- CDN缓存是存在CDN 节点服务器
缓存文件问题
- 如果在缓存时间内,CDN缓存了HTML,即使用无痕浏览器打开也是会返回旧的HTML,需要手动刷新CDN,才能保证拿到最新的资源
CDN缓存和浏览器缓存
CDN缓存和浏览器缓存属于两层缓存机制,通过CDN缓存,减轻源站的压力,而浏览器缓存,减少用户重复请求,提升页面加载速度
- 1、浏览器请求资源 → 先查本地是否有缓存
- 2、若本地缓存过期 → 向 CDN 请求资源
- 3、CDN 命中缓存 → 直接从CDN节点服务端返回缓存资源;
- 4、CDN 也过期 → 请求回源,从源站拿到最新的资源,再返回浏览器
CDN的TTL
- TTL = Time To Live(存活时间)、
- 配置cdn的TTL缓存时间
- CDN 控制台 配缓存规则
- 按路径配置
/play/*
TTL = 60 秒
/_nuxt/*
TTL = 30 天
*.js / *.css
TTL = 30 天
*.jpg / *.webp
TTL = 7 天
- 从HTTP响应头能看到TTL的缓存时间
900:CDN 当前缓存时间约为 900 秒,也就是 15 分钟X-Cache: HIT:本次请求命中 CDNAge: 21:该缓存对象已经在 CDN 中存在约 21 秒Via: ens-cache...:请求经过阿里云 CDN
X-Swift-CacheTime: 900
Cache-Control: max-age=900
X-Cache: HIT TCP_MEM_HIT
Age: 21
CDN和源站
- 当CDN配置了遵循源站缓存行为,则源站策略会影响CDN的行为
- CDN可配置是否遵循源站策略
- 默认是关闭缓存遵循源站功能
- 双重校验机制
- 1、源站强制设置缓存策略,配置缓存头
- 2、配置CDN缓存策略,来覆盖源站缓存策略
CDN挂了,如何解决?
CDN服务不稳定,如果出现CDN挂掉了如何解决?
- 1、启用备用源 (Fallback 机制)
- 当某个 CDN 资源加载失败时,自动切换到备选源或主站资源
- 2、DNS 解析切换,切换一个 CDN 服务商
- 3、将静态资源部署回自己的服务器
加速域名和源站域名
- 加速域名:指用户提供的需要使用CDN加速服务的域名,即终端用户访问的域名。
- 源站域名:指服务器IP地址对应的域名,即CDN回源时访问的域名
加速域名和源站域名不能是同一个域名:用户访问加速域名的网站资源,当CDN节点上没有缓存对应的内容时,CDN节点会回到源站获取,然后再返回给用户。如果源站域名与加速域名一致,将会造成访问请求反复解析到CDN节点,导致CDN节点无法回源拉取请求内容
前端静态资源部署CDN
- 前端打包好的静态资源上传到源站服务器
- CDN控制台配置加速域名、设置绑定对应源站地址
- 配置CDN缓存策略
- 设置缓存时间、回源规则
- JS、CSS、图片等资源可以长时间缓存(例如 30 天)
- index.html 不缓存
- 浏览器访问 CDN 域名,判断缓存是否命中
- 命中缓存 → 直接从CDN节点服务端返回缓存资源;
- 未命中 → 回源获取 → 缓存到CDN → 返回资源
- 前端重新发版本部署时,需要刷新CDN, 可以通过脚本来自动刷新CDN,不需要手动到控制台去刷新
- 避免CDN存在缓存,导致用户没有及时访问最新的资源
- CDN有提供刷新缓存的API
回源策略:当 CDN 节点上没有该资源时,会自动回源到源站去拉取, 拉取后会将该资源 缓存到 CDN 节点
注意:不需要手动上传资源到CDN,因为CDN如果没有命中资源,会直接从源站中获取, 只要源站上有最新资源