序
为了进一步提高网站的访问速度,我们会使用CDN来提升网站速度,但是最近在调试阿里云和CDN的功能计算时,发现了一个需要额外注意的地方。
如何使用CDN缓存部署在函数计算上的静态网站
然后以我在函数计算上部署的博客站[1]为例,逐步介绍如何使用CDN缓存函数计算托管的静态网站。
将CDN功能添加到功能
1)为功能分配域名并添加CNAME记录。
因为我希望最终用户通过blog.dengchao.fun访问它,所以有必要为该函数分配一个不同的域名blog.xxx.dengchao.fun:
2)添加自定义域名并设置路由。
将分配的域名设置为由函数计算的自定义域名函数:
因为在CDN上也可以设置HTTPs,在函数计算之前不能设置SSL协议版本,所以这里不开启HTTPS功能。
3)添加源站类型为“函数计算域名”的CDN
接下来,在CDN控制台上创建一个新的加速域名:
最终用户会通过加速域名blog.dengchao.fun来访问我的博客站服务类型选项不会影响最终的加速效果,可以任意选择。
然后添加一个源站:
因为函数计算的自定义域名不开放HTTPS,所以需要将源站的端口设置为80端口,这样也可以减少返回源时的响应时间。
4)添加CNAME类型CDN以加速域名记录
设置好源站信息并保存后,阿里云会对源站内容进行审核。如果获得批准,它将为您提供一个CDN服务提供商的域名:
接下来,您需要将您的加速域名解析为CDN服务提供商提供的域名:
添加CNAME记录后,过一会儿CDN控制台会显示为“已配置”,然后你就可以使用配置好的加速域名进行访问了。
设置CDN缓存
配置加速域名是不够的,否则用户每次访问加速域名都需要从源站拉取数据,所以我们需要在CDN上设置缓存,减少回源的次数。
1)添加缓存过期规则。
假设我们希望CDN节点能够缓存网站根目录下的所有内容1天,那么我们需要在CDN加速域名的缓存管理页面添加相应的配置:
我以为这里刚开始的时候设置了缓存,但是网站运行一段时间后,观察CDN的监控,发现缓存命中率一直很低。通过观察浏览器控制台中的网络请求日志,逐一分析请求头,最终发现一个异常:源站将Cache-Control响应头设置为public,max-age=0。
2)修复缓存控制响应报头。
仔细查看了MDN上关于Cache-Control响应头的文档[2]和阿里云CDN关于缓存过期时间配置的介绍[3]后,确认之前的CDN缓存配置存在缺陷。
定位问题后,解决方案很明确:想办法删除源站的Cache-Control响应头就行了。
方案一:修改源站HTTP服务器返回的Cache-Control响应头。
既然源站的HTTP服务器已经设置了Cache-Control响应头为max-age=0,为什么我们不改变源站的HTTP服务器呢?
但考虑到我们在函数计算中部署的静态网站是由网站-fc插件生成的Express服务器托管的,如果修改,需要从本地网站-fc插件源代码进行调整。但是网站-fc插件可能会不定期更新,所以我们需要不定期检查,必要时再打补丁,实现起来非常费力。所以我们不能选择这个方案。
方案二:配置CDN,删除源站HTTP服务器返回的Cache-Control响应头。
再看文档,发现阿里云CDN提供了配置回源HTTP响应头的功能[4],包括删除回源响应头的功能。所以我们可以用这个函数让CDN删除源站返回的Cache-Control响应头。
配置完成后,再次观察加速域名下网络请求的响应头,发现确实没有cache-control: public和max-age=0的响应头。
3)效果对比
因为博客站访问量不高,效果不明显。所以拍了另一个访问量比较大的网站的监控截图:
首先,是访问量的对比。从监测数据来看,近两天的访问量并没有明显差异:
然后与回源流量进行比较,发现删除缓存控制响应头后,回源流量明显下降:
同时,字节命中率和请求命中率显著提高:
看来我们配置的缓存确实生效了。
摘要
配置CDN加速域名和缓存过期时间规则后,记得检查源站的响应头。如果源站的响应中已经存在与缓存控制相关的响应头,则在源站的HTTP服务器或CDN上进行适当的调整。
另外,看文档。
参考链接:
[1]博客站
https://blog.dengchao.fun/
[2]MDN上缓存控制响应报头的文档
https://developer . Mozilla . org/zh-CN/docs/Web/HTTP/header/Cache-Control
[3]阿里云CDN对缓存过期时间配置的介绍
https://help . aliyun . com/document _ detail/27136 . html # title-p27-252-g92
[4]配置回源HTTP响应报头
https://help.aliyun.com/document_detail/155769.html
[5]阿里云函数计算
https://help.aliyun.com/product/50980.html
[6]阿里云CDN
https://help.aliyun.com/document_detail/27101.html
[7]加速原理
https://help . aliyun . com/document _ detail/27101 . html # title-sbn-geq-2ez
[8]配置回源HTTP响应报头
https://help.aliyun.com/document_detail/155769.html
[9]什么是缓存?
https://help.aliyun.com/document_detail/122553.html
[10]配置缓存过期时间
https://help.aliyun.com/document_detail/27136.html
[11]缓存规则和优先级
https://help . aliyun . com/document _ detail/27136 . html # title-p27-252-g92
[12]什么是高速缓存控制响应报头?
https://developer . Mozilla . org/zh-CN/docs/Web/HTTP/header/Cache-Control
作者:邓超|无服务器开发开源贡献者
原文链接:http://click.aliyun.com/m/1000342593/
本文为阿里云原创内容,未经允许不得转载。