如何使用 Cloudflare 工作人员为静态网站优化 TTFB?

时间:2021-02-28 07:24:08

标签: github-pages cloudflare cloudflare-workers

我有一个托管在 GitHub Pages 上的网站,它是完全静态的 HTML,加载速度相当快。我一直在尝试缩短 TTFB 时间(以及 FCP、LCP 和 Full Loaded)。
现在尝试专注于 TTFB,我做了几次尝试。

  1. 在仅 DNS 模式下使用 Cloudflare,我获得了一致的 TTFB 这比 30 毫秒低 99%。
  2. 在代理模式下使用 Cloudflare 和页面规则来“缓存 一切”,TTFB 始终在 100 毫秒以上。

然后我尝试使用 Cloudflare 工作人员,想法很简单:

  • a.将当前网站内容提取到工作器中。
  • b.缓存内容
  • c.提供缓存的内容

令人惊讶的是,我没有得到比 80 毫秒更好的结果,尽管我期望的 TTFB 比我的第 1 次试用(仅 DNS 模式)要少得多,但平均而言,TTFB 介于 100 毫秒和 150 毫秒之间;我正在测试 Worker 的 url (random-name.organization-name.workers.dev)。 我怀疑我的工作代码有问题,这是我迄今为止尝试过的(主要来自文档)

const url = "https://domain.extension"
async function gatherResponse(response) {
  const { headers } = response
  return await response.text()
}
async function handleRequest() {
  const init = {
    headers: {
      "content-type": "text/html;charset=UTF-8",
    },
    cf: {
      cacheTtl: 50000,
      cacheEverything: true,
    },
  }
  const response = await fetch(url, init)
  const results = await gatherResponse(response)
  return new Response(results, init)
}
addEventListener("fetch", event => {
  return event.respondWith(handleRequest())
})

是否有办法缓存所有内容并让工作程序以比仅 DNS 选项更快的速度提供服务?我尝试升级我的 Cloudflare 计划,并且还聘请了一名付费员工,希望能够无可救药地节省更多毫秒。

3 个答案:

答案 0 :(得分:2)

当涉及到您描述的基本缓存时,Worker 不会比 Cloudflare 的内置 HTTP 缓存选项提供任何好处。如果你已经设置页面规则指定“缓存所有内容”和“边缘缓存TTL 50000”,那么你写的Worker代码不会有任何额外的效果。当您有更复杂的逻辑而单独使用页面规则时,Worker 会很有用。

(实际上,您发布的特定代码实际上会使 TTFB 变得更糟,因为它在返回响应之前执行了 await response.text() - 这迫使 Worker 在任何响应之前等待整个响应主体到达 Cloudflare响应被发送到客户端。通常,Workers 会在响应内容到达时将其流式传输。)

如果您发现您的站点在仅 DNS 模式下比在代理模式下更快,这很可能意味着您正在测量速度的位置(例如您的家庭互联网)与您的源服务器相近是 Cloudflare。这是不寻常的,但它可能发生。为了更真实地了解性能差异,您需要从世界各地的多个位置进行测量。注意因为GitHub本身已经使用了缓存CDN来服务Pages,你可能还是会发现平均性能差异不是很大。

答案 1 :(得分:0)

Github Pages 有一个 10 分钟/600 秒的缓存控制标头。这“有效”就足够了。如果您向客户使用“git push”来破坏您的网站,您网站上的缺陷会在 10 分钟内消失。

我将我的 github 页面与 Cloudflare infront 保持为

foosite.tk/* 浏览器缓存 TTL:8 天,缓存级别:缓存一切,边缘缓存 TTL:7 天

Github Pages raw 会导致你的浏览器总是做大量的
“几分钟后”“当你回来”到选项卡后,对所有资产的“304 未修改”请求。使用上面的设置可以让浏览器几乎永远缓存东西,让 CF 几乎永远缓存东西。您将不得不在 CF Dash 中使用“清除所有内容”以使您的 git push 到 github 显示在客户端站点上,并强制刷新客户端。

答案 2 :(得分:0)

我也在 TTFB 上工作,并且观察到 CF 在某些位置(在我的情况下是香港和台湾)增加了 TTFB。

我的 CF 门票 - https://vocus.cc/article/609f1dfdfd897800011cbfa2

从 CF 中了解到,如果您不在企业计划中,他们的路由可能不会 100% 进行地理优化(该帖子说来自印度的测试被发现路由到新加坡的 CF 服务器,然后返回印度)

我现在的措施是用页面规则“缓存所有东西”,虽然它仍然不能低于100毫秒(但只有DNS可以),它在峰值上减少了很多,很少看到超过400毫秒的TTFB缓存所有东西。< /p>