自从明月博客切换回上海云盾 CDN (可参考【博客正式再次切换到上海云盾 CDN 了! 】一文)以来,明月基本就没有怎么过多关注过,直到前天龙少(龙笑天下)提醒下才发现上海云盾 CDN 的缓存命中率好像非常的低,通过上海云盾后台统计报表的数据简单计算了一下回源命中率只有 30%左右,说实话确实有点儿低了,按理说用Dragon 主题这么低的 CDN 缓存命中率是不可能的,因为单单Dragon 主题特有的缩略图伪静态化地址就能提升不少的 CDN 缓存命中率的。很明显,这是不科学的!
图 1
借助 Chrome、Firefox、Edge 三大浏览器的“开发人员工具”发现问题就出在Dragon 主题特有的缩略图伪静态化地址没有被 CDN 缓存造成的,缩略图图片都是“MISS”状态,都回源请求了!而Dragon 主题特有的缩略图伪静态化地址都是如下格式:
https://www.imydl.com/timthumb/aHR0cHM6Ly93d3cuaW15ZGwuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDIyLzExL1dQLVN1cGVyLUNhY2hlMi5wbmc/w/375/h/250/q/90/zc/1/a/c/spm/f018d127388d887f176e3354ce435a76.png
很明显这是近乎完美的伪静态化链接,也是符合 CDN 静态图片缓存规则的。于是,立马在上海云盾后台联系云盾售后客服求助,经过客服测试排查后,第二天给我反馈了如下的故障分析结果:
上图所说的 Vary 加了 cookie,指的就是图 1 中的那行:Vary: Accept-Encoding,Cookie
问题找到了,那么这个Vary: Accept-Encoding,Cookie是从哪里来的呢?Nginx 里各个配置文件都排查了确定是没有的,只能求助谷歌、百度了,一番搜索发现这个Vary: Accept-Encoding,Cookie竟然是 WP Super Cache 插件加的,详细了解后发现这个Vary 中的 cookie:可能被服务端用做输出差异化内容的依据。用户的每次请求,CDN 可能会根据 cookies 对于用户间差异回源访问,导致 CDN 服务器不断回源,到源站抓取文件和信息。但为什么作者仍要写 cookie,而不是删除掉这项呢?因为可以用 cookie 来识别已登录用户。如果删除"cookie" 一项,可能会导致服务器缓存一些隐私页面,分发给匿名用户,导致隐私泄露。
当然,WP Super Cache 也考虑到了这个问题,最新版的 WP Super Cache 可以在 wp-config.php 里指定WPSC_VARY_HEADER变量来自定义,否则就使用 WP Super Cache 插件默认值:Vary: Accept-Encoding,Cookie。wp-config.php 里可以直接设定WPSC_VARY_HEADER去掉 cookie:
define( 'WPSC_VARY_HEADER', 'Accept-Encoding' );
但这样设置会给需要用户登录的 WordPress 站点带来一个“缓存一些隐私页面,分发给匿名用户,导致隐私泄露”,很明显,这个方法是不适合明月博客的,如果是单用户 WordPress 站点这个方法倒是简单高效了。
考虑到明月博客的缩略图伪静态地址都是/timthumb/前缀的,那么不让 WP Super Cache 缓存这个目录不就可以了,不让 WP Super Cache 缓存设置只需要在 WP Super Cache 后台——高级——URL 字符串被拒绝里放入这个目录前缀即可,如下图所示:
然后,保存——删除缓存,这时候回到首页强制刷新(Ctrl+F5)在“开发人员工具”里查看缩略图返回头部信息,如下图:
如上图,那行Vary: Accept-Encoding,Cookie消失不见了,红色箭头所指的 X-Cache 为HIT了,意思是 CDN 已经缓存并命中调用了缓存,没有回源请求。完美解决了,到今天为止上海云盾 CDN 的缓存命中率已经大幅提升,如下图:
可以换算一下这个命中率有多少?嘿嘿
可以说是效果立竿见影,网站载入速度明显能感觉到有不小的提升,万万没有想到 WP Super Cache 竟然会影响 CDN 缓存命中率,说实话真的是有点儿意外了,好在找到了问题所在,还第一时间给解决了,还是值得欣慰的!