今天为自己的博客更新了主题插件,发现显示样式明显不太对了,但是使用Web查看器,没发现什么问题。仔细观察了下,发现某些js文件和css文件的查询字符串中标记版本更新的字段已经更新,但是实际取到的文件并没有被更新。
如下面这个链接
1 |
https://static1.sharpbai.com/wp-includes/css/dashicons.min.css?ver=4.7.3 |
原来的链接为ver=4.7.2。但是我实际访问两个链接,内容完全一致。手工访问源站,发现文件是更新的。这是什么原因呢?
先来介绍下我使用的CDN架构。我将CDN域名static1.sharpbai.com解析到七牛上,并配置七牛上加速域名static1.duobeiyun.com的源站为名为blog的存储空间。然后存储空间blog的镜像源配置为真实源站地址。所以用户的请求会经历以下步骤:
进一步查看,果然存储空间内的内容不是新的,这才是真正的原因。
此类问题的解决方案就是,现在存储空间内把对应的文件删掉,再在融合CDN里刷新对应的URL即可解决。
这里其实反馈出七牛云在处理存储空间时的一个问题。虽然我在融合CDN里默认配置并没有忽略URL查询字符串来回源,但经过存储空间这一步,无论如何都会清除掉查询字符串来存储内容,这就不合理了。另外发现了一个现象,之前七牛还不叫七牛云,七牛的CDN还不叫融合CDN的时候,更新文件只需要在存储空间里把文件删了或者覆盖掉,所有边缘节点都会刷新,现在做大了,这个比较方便的机制反而取消了,应该是实际应用中发现这个功能带来的问题大于作用吧,而且确实其他家也都不是这么做的。
工作原因接触了不少CDN,在这种问题上,大家其实做法都差不多。比如在又拍云上刷新开启了源站转移功能的自主源站CDN服务,也是需要先删除文件,但又拍没有提供网页版的界面,删除操作可以使用ftp或者upx或API和各种SDK。删除完成之后,再刷新URL即可。
那为什么要开启源站迁移功能或使用镜像存储呢?主要是为了能够减少回源次数,增加访问速度。因为CDN的边缘节点可以更快的直接访问自家的CDN的存储空间,而不是需要每次都直接访问源站。但是这样需要在设计web应用时注意命名问题,最好每次都更新文件名而不是使用查询字符串来更新版本,这样每次更新会更方便。