Saber 酱的抱枕

Fly me to the moon

08/16
2026
其他

使用 CloudFlare 的 APO 功能进行页面静态化

本站的静态资源因为有 CloudFlare 的 CDN 加速,所以加载速度很快,但是网页本身是动态生成的,加载速度经常需要 500 多毫秒,成为了对加载速度影响最大的瓶颈。

CloudFlare 的 APO 功能(Automatic Platform Optimization)会自动把页面的 HTML 代码缓存到边缘节点,走 CDN 加速,可以大幅降低 TTFB(首字节到达时间)。这有点像静态化,但是不需要在服务器上保存静态化的 HTML 文件,也无需配置规则,非常省心。

加速效果

加速效果非常明显,使用缓存时,首页文档本身的加载时间从 500 多 ms 降低到 50 多 ms:

性能指标也有了对应的提升:

这个优化让加载时间一下子缩短了 0.5 秒,提升巨大。现在首次访问本站时,完整加载时间只需要 1 秒,后续打开其他文章页面时只需要 0.6 秒。

注意:
APO 不会缓存有静态内容的页面,如搜索页、后台页面。另外,它的缓存只会给未登录用户使用,对登录了本站的用户无效。因为登录后会产生动态内容,无法使用缓存的网页代码。这倒正符合本站的情况,因为大部分用户都是访客。

负面影响

访客访问时不会经过后台处理

如果你想让后台代码能处理访客的访问,就需要谨慎使用此功能。

一个实际案例:由于页面的缓存命中率很高,导致“显示文章查看次数”的插件出现了异常,显示的次数远小于实际查看次数。原因是缓存的页面不会经过后台处理,不会触发“查看数量+1”的效果。所以现在我关闭了显示文章查看次数的插件。

7 月里番的文章在一个月的时间里,查看次数有两千多次。我在启用了 APO 功能之后发表了 8 月里番的文章,过了一个月查看次数还不到 200,数据不到之前的十分之一。但是最近我的网站访问次数并没有下降,这让我颇为疑惑,后来才想到是 APO 导致的:访客查看文章时,如果加载的是 CloudFlare 缓存的页面,就永远不会增加查看次数。只有以下不使用缓存的情况才会让查看次数增加:

  • 已登录用户(永远不会使用缓存,所以每次查看都会正常增加次数)
  • 用户强制刷新页面(本次请求不使用缓存,查看次数 + 1)
  • CloudFlare 服务器新增或更新该页面的缓存(查看次数 + 1)

文章页面的缓存更新可能不及时

当页面内容变化时,APO 会在一定时间后自动更新缓存内容。官方说是 30 秒内更新,但我发现有时会超过这个时间。当我修改文章内容之后,如果缓存没有及时更新,那么访客看到的就还是之前的旧内容。

如果要验证这一点,可以先使用访客模式打开文章页面,此时会打开缓存的页面。如果该页面之前未在该网络链路的边缘服务器上缓存,会新生成一份缓存。响应头里的 last-modified 就是这份缓存创建/更新的时间。

然后修改文章内容并更新,再刷新访客的网页,看内容有没有更新。如果很长时间后仍未更新,可以在博客后台的 Cloudflare 插件里点击 Purge Cache 按钮手动重建缓存。

使用 CloudFlare 的 APO 功能进行页面静态化