<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cloudflare Pages on kenji.blog</title><link>http://kenji.blog/zh-cn/tags/cloudflare-pages/</link><description>Recent content in Cloudflare Pages on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/zh-cn/tags/cloudflare-pages/index.xml" rel="self" type="application/rss+xml"/><item><title>如何利用Cloudflare Pages和GitHub Pages免费、极速地托管Hugo博客</title><link>http://kenji.blog/zh-cn/p/hugo-hosting-cloudflare-vs-github-pages/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/zh-cn/p/hugo-hosting-cloudflare-vs-github-pages/</guid><description>&lt;img src="http://kenji.blog/p/hugo-hosting-cloudflare-vs-github-pages/img/eyecatch.jpg" alt="Featured image of post 如何利用Cloudflare Pages和GitHub Pages免费、极速地托管Hugo博客" />&lt;p>在运营网站或博客时，页面加载速度（性能）、运营成本以及安全性是至关重要的因素。过去，动态CMS（内容管理系统，如WordPress）与租用服务器的组合是主流，但现在，被称为“Jamstack”的架构受到了极大的关注。其中，将由Go语言编写的超高速静态网站生成器（SSG）“Hugo”与Cloudflare Pages或GitHub Pages等现代托管服务相结合，可以构建&lt;strong>完全免费且极速&lt;/strong>的博客环境。&lt;/p>
&lt;p>本文将从技术角度深入探讨，为您详细讲解将Hugo生成的静态网站发布到Cloudflare Pages和GitHub Pages的具体步骤、各平台在架构上的差异、如何使用GitHub Actions构建CI/CD（持续集成/持续部署）、DNS优化、缓存策略，以及如何引入注重隐私的访问分析工具。&lt;/p>
&lt;hr>
&lt;h2 id="1-静态网站生成器ssg与jamstack基础">1. 静态网站生成器（SSG）与Jamstack基础
&lt;/h2>&lt;h3 id="11-为什么选择静态网站">1.1 为什么选择静态网站？
&lt;/h3>&lt;p>传统的动态CMS（例如：WordPress）在每次收到用户请求时，都会向数据库（如MySQL）发起查询，并在服务器端（如PHP）动态生成HTML后返回。这种方式虽然灵活性高，但应对流量激增（所谓的爆发性流量或DDoS攻击）的抵抗力较低，且往往需要在前端放置缓存服务器（如Redis或Varnish），导致基础设施架构变得复杂。&lt;/p>
&lt;p>相比之下，采用Jamstack（JavaScript, APIs, and Markup）架构的静态网站生成器（SSG）会在事前（构建时）生成所有的HTML文件、CSS和JavaScript。当用户发起请求时，Web服务器（或CDN）只需将已生成的静态文件直接返回，从而实现压倒性的高速和坚固的安全性。&lt;/p>
&lt;h3 id="12-hugo的优势">1.2 Hugo的优势
&lt;/h3>&lt;p>在SSG中，有Next.js、Gatsby、Jekyll、Astro等多种选择，而Hugo最大的特点在于其&lt;strong>构建速度&lt;/strong>。得益于Go语言的并发处理能力，即使是拥有几千到几万页面的网站，构建也能在短短几秒内完成。这大幅减少了CI/CD流水线中的等待时间，直接提升了开发者体验（DX: Developer Experience）。&lt;/p>
&lt;hr>
&lt;h2 id="2-托管服务架构比较">2. 托管服务架构比较
&lt;/h2>&lt;p>将Hugo生成的静态文件托管在哪里，是接下来的课题。典型的选项包括Cloudflare Pages、GitHub Pages以及Netlify，但它们背后的网络架构各有不同。&lt;/p>
&lt;h3 id="21-cdn与边缘计算">2.1 CDN与边缘计算
&lt;/h3>&lt;p>这些平台全部利用全球分布的CDN（内容分发网络）来分发内容。然而，与仅仅缓存静态文件不同的是，能否通过“边缘计算”在离用户最近的PoP（节点，Point of Presence）执行请求路由和请求头重写，成为了它们的差异化因素。&lt;/p>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;用户 (东京)&amp;#34;] --&amp;gt;|低延迟| B[&amp;#34;边缘节点 (NRT)&amp;#34;]
C[&amp;#34;用户 (纽约)&amp;#34;] --&amp;gt;|低延迟| D[&amp;#34;边缘节点 (EWR)&amp;#34;]
E[&amp;#34;用户 (伦敦)&amp;#34;] --&amp;gt;|低延迟| F[&amp;#34;边缘节点 (LHR)&amp;#34;]
B --&amp;gt; G[&amp;#34;源站存储 / 对象存储&amp;#34;]
D --&amp;gt; G
F --&amp;gt; G
&lt;/pre>
&lt;h3 id="22-github-pages">2.2 GitHub Pages
&lt;/h3>&lt;p>GitHub Pages是一项能够直接从GitHub仓库发布HTML、CSS和JavaScript文件的服务。其背后使用了Fastly等CDN，能够发挥出色的性能。但是，它在自定义请求头（例如：&lt;code>Cache-Control&lt;/code>和安全头）方面存在限制，而且重定向设置还需要依赖HTML的meta refresh或Jekyll插件，作为纯粹基础设施的功能显得较为有限。&lt;/p>
&lt;h3 id="23-cloudflare-pages">2.3 Cloudflare Pages
&lt;/h3>&lt;p>Cloudflare Pages是建立在Cloudflare引以为豪的全球最大规模Anycast网络（覆盖275个以上城市）之上的静态网站托管服务。
它原生支持HTTP/3（QUIC）、图像优化以及集成边缘函数（Cloudflare Workers），可以进行极致的性能调优。此外，它不对带宽进行计费，无论流量如何激增都能免费运营，这是一个巨大的优势。&lt;/p>
&lt;h3 id="24-netlify">2.4 Netlify
&lt;/h3>&lt;p>Netlify是Jamstack的先驱，提供了集成表单功能、认证（Identity）、无服务器函数等在内的多合一DX体验。然而，当超出免费额度的带宽（每月100GB）时，将会产生高昂的按量计费费用，因此在大量使用图像和视频的博客中需要注意成本控制。&lt;/p>
&lt;hr>
&lt;h2 id="3-性能与延迟的理论计算基于latex的数学模型">3. 性能与延迟的理论计算（基于LaTeX的数学模型）
&lt;/h2>&lt;p>在评估Web性能时，减少延迟（Latency）是最重要的指标。我们来建立一个模型，看看与直接访问源站相比，使用CDN（边缘）能够减少多少延迟。&lt;/p>
&lt;p>设用户请求命中缓存的概率为“缓存命中率（Cache Hit Ratio）”，记作 $C$。且 $0 \le C \le 1$。
设到源站的延迟为 $L_{origin}$，到最近边缘节点的延迟为 $L_{edge}$。&lt;/p>
&lt;p>新的平均延迟 $L_{new}$ 可以作为以下期望值进行计算：&lt;/p>
$$ L_{new} = C \times L_{edge} + (1 - C) \times (L_{edge} + L_{origin}) $$&lt;p>将此公式简化后如下所示：&lt;/p>
$$ L_{new} = L_{edge} + (1 - C) \times L_{origin} $$&lt;p>例如，当东京的用户访问位于美国东海岸（纽约）的源站时，考虑到光纤的物理距离和路由器处理延迟，$L_{origin}$ 约在 200 ms 左右。另一方面，如果使用像Cloudflare这样的CDN，就可以连接到东京的边缘节点，$L_{edge}$ 会缩短到约 10 ms。&lt;/p>
&lt;p>假设缓存命中率为 $C = 0.95$（95%），则：&lt;/p>
$$ L_{new} = 10 + (1 - 0.95) \times 200 = 10 + 0.05 \times 200 = 10 + 10 = 20 \text{ ms} $$&lt;p>由此可见，通过引入CDN，可以将平均延迟从 210 ms 大幅（约90%）降低到 20 ms。&lt;/p>
&lt;hr>
&lt;h2 id="4-使用github-actions构建cicd流水线">4. 使用GitHub Actions构建CI/CD流水线
&lt;/h2>&lt;p>为了自动化Hugo博客的更新流程，我们利用GitHub Actions构建CI/CD流水线。这样一来，只需在本地编写Markdown文章并执行 &lt;code>git push&lt;/code>，就会自动触发构建，并部署到Cloudflare Pages或GitHub Pages。&lt;/p>
&lt;p>以下的时序图展示了从推送文章到分发给用户的整个流程。&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
participant U as &amp;#34;用户 (作者)&amp;#34;
participant G as &amp;#34;GitHub 仓库&amp;#34;
participant A as &amp;#34;GitHub Actions&amp;#34;
participant C as &amp;#34;Cloudflare Pages&amp;#34;
participant V as &amp;#34;访问者&amp;#34;
U-&amp;gt;&amp;gt;G: &amp;#34;git push origin main&amp;#34;
G-&amp;gt;&amp;gt;A: &amp;#34;触发 Push 事件&amp;#34;
A-&amp;gt;&amp;gt;A: &amp;#34;Checkout &amp;amp; 设置 Hugo&amp;#34;
A-&amp;gt;&amp;gt;A: &amp;#34;hugo --minify (构建)&amp;#34;
A-&amp;gt;&amp;gt;C: &amp;#34;部署到 Cloudflare Pages (直接上传)&amp;#34;
C--&amp;gt;&amp;gt;A: &amp;#34;部署 URL (成功)&amp;#34;
V-&amp;gt;&amp;gt;C: &amp;#34;请求网页&amp;#34;
C--&amp;gt;&amp;gt;V: &amp;#34;返回缓存的 HTML (边缘)&amp;#34;
&lt;/pre>
&lt;h3 id="41-针对cloudflare-pages的部署设置直接上传">4.1 针对Cloudflare Pages的部署设置（直接上传）
&lt;/h3>&lt;p>Cloudflare Pages提供了两种方法：一是绑定GitHub仓库并在Cloudflare的基础设施上进行构建；二是将在GitHub Actions中构建好的静态文件进行“直接上传（Direct Upload）”。如果想更严格地管理Hugo的版本，并与其他任务（如测试和图像优化）联动，推荐在GitHub Actions上构建并使用直接上传的方式。&lt;/p>
&lt;p>以下是一个用于部署到Cloudflare Pages的 &lt;code>.github/workflows/deploy.yml&lt;/code> 实用示例：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Deploy Hugo site to Cloudflare Pages&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">push&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">branches&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;main&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">workflow_dispatch&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">build-and-deploy&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;ubuntu-latest&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Checkout repository&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;actions/checkout@v4&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">submodules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;recursive&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">fetch-depth&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Setup Hugo&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;peaceiris/actions-hugo@v3&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">hugo-version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;0.125.0&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">extended&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Build Hugo Site&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;hugo --minify --gc&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">env&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">HUGO_ENVIRONMENT&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;production&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Deploy to Cloudflare Pages&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;cloudflare/pages-action@v1&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">apiToken&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ secrets.CLOUDFLARE_API_TOKEN }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">accountId&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ secrets.CLOUDFLARE_ACCOUNT_ID }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">projectName&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;your-project-name&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">directory&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;public&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">gitHubToken&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ secrets.GITHUB_TOKEN }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">branch&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;main&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>在这条流水线中，通过 &lt;code>--minify&lt;/code> 选项最小化了HTML/CSS/JS代码，并通过 &lt;code>--gc&lt;/code> 删除了不必要的文件。这些都是性能优化的基本操作。&lt;/p>
&lt;hr>
&lt;h2 id="5-深入理解dns设置自定义域名与cname--alias记录">5. 深入理解DNS设置：自定义域名与CNAME / ALIAS记录
&lt;/h2>&lt;p>当使用自定义域名（例如：&lt;code>kenji.blog&lt;/code>）时，正确的DNS（域名系统）设置是必不可少的。&lt;/p>
&lt;h3 id="51-cname记录的限制与zone-apex">5.1 CNAME记录的限制与Zone Apex
&lt;/h3>&lt;p>通常情况下，将子域名（例如：&lt;code>www.kenji.blog&lt;/code>）指向外部服务时，会使用 &lt;code>CNAME&lt;/code> 记录。然而，根据DNS规范（RFC 1034），根域名（Zone Apex，也称为裸域名，例如：&lt;code>kenji.blog&lt;/code>）不能设置 &lt;code>CNAME&lt;/code> 记录。这是因为Zone Apex必须存在SOA（起始授权机构）记录、NS（名称服务器）记录和MX（邮件交换）记录，而规则规定CNAME不能与其他资源记录共存。&lt;/p>
&lt;h3 id="52-解决方案alias--aname--cname-flattening">5.2 解决方案：ALIAS / ANAME / CNAME Flattening
&lt;/h3>&lt;p>为了解决这个问题，现代的DNS提供商提供了他们独有的扩展功能。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>ALIAS / ANAME记录&lt;/strong>: 在DNS服务器端动态解析，并将最终的A记录（IP地址）返回给客户端。Amazon Route 53等支持该功能。&lt;/li>
&lt;li>&lt;strong>CNAME Flattening&lt;/strong>: 这是Cloudflare提供的功能。它表现得就像是在Zone Apex设置了CNAME一样，但实际上是Cloudflare的权威DNS服务器自动解析出一组IP地址（A记录和AAAA记录）并透明地返回给客户端。&lt;/li>
&lt;/ul>
&lt;p>如果使用Cloudflare Pages，将域名的名称服务器委托给Cloudflare，并利用这个“CNAME Flattening”功能，将是实现无缝且高性能的最佳架构。&lt;/p>
&lt;hr>
&lt;h2 id="6-缓存策略与http请求头控制">6. 缓存策略与HTTP请求头控制
&lt;/h2>&lt;p>在静态网站加速方面，另一个关键点是“缓存策略”。在Cloudflare Pages中，可以利用生成的文件（&lt;code>_headers&lt;/code> 文件）对HTTP响应头进行精细的控制。&lt;/p>
&lt;h3 id="61-边缘缓存-edge-cache-vs-浏览器缓存-browser-cache">6.1 边缘缓存 (Edge Cache) vs 浏览器缓存 (Browser Cache)
&lt;/h3>&lt;p>缓存大致可以分为在CDN端保存的“边缘缓存（Edge Cache）”和在用户浏览器中保存的“浏览器缓存（Browser Cache）”两种。&lt;/p>
&lt;p>对于静态文件（如文件名中包含哈希值的图像、CSS、JS等），理想的做法是让浏览器进行长期的缓存。另一方面，为了使HTML文件的更新能够立即生效，一般的做法是缩短（或禁用）浏览器缓存，转而依赖边缘缓存来处理请求。&lt;/p>
&lt;p>Cloudflare Pages中的 &lt;code>_headers&lt;/code> 设置示例：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># HTML文件不在浏览器缓存，每次都进行验证
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/*.html
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Cache-Control: public, max-age=0, must-revalidate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"># 资源文件（CSS/JS/图像）让浏览器缓存1年
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/assets/*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Cache-Control: public, max-age=31536000, immutable
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/img/*
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Cache-Control: public, max-age=31536000, immutable
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="62-带宽成本削减的计算公式">6.2 带宽成本削减的计算公式
&lt;/h3>&lt;p>通过设置合适的缓存头，可以大幅减少从服务器（边缘）传输的数据量。月度带宽成本 $Cost$ 可以通过各资源的传输量 $B_i$、缓存命中率 $C_i$ 以及带宽单价 $R$ 的以下模型来表示：&lt;/p>
$$ Cost = \sum_{i=1}^{n} \left( B_i \times (1 - C_i) \times R \right) $$&lt;p>由于Cloudflare的下行传输量是免费的（$R = 0$），因此直接的资金成本为 $0$。然而，如果同时使用GitHub Pages等其他基础设施，或者以AWS S3等作为后端，最大化这个缓存命中率 $C_i$ 将是削减基础设施成本的关键。&lt;/p>
&lt;hr>
&lt;h2 id="7-兼顾隐私与性能的访问分析">7. 兼顾隐私与性能的访问分析
&lt;/h2>&lt;p>在运营博客时，了解有多少用户访问的访问分析（Web Analytics）是必不可少的。长期以来，Google Analytics（GA4）一直是事实上的标准，但随着近年来隐私保护的趋势（如GDPR、CCPA）以及第三方Cookie的废除，情况正在发生变化。&lt;/p>
&lt;h3 id="71-对web性能的影响">7.1 对Web性能的影响
&lt;/h3>&lt;p>如果引入Google Analytics（具体来说是 &lt;code>gtag.js&lt;/code> 或 Google Tag Manager），将会加载和执行大量的外部脚本，从而对性能（尤其是TTFB和主线程阻塞时间）产生负面影响。&lt;/p>
&lt;p>让我们将网站的加载时间进行如下分解：&lt;/p>
&lt;pre class="mermaid">
pie title 典型网站加载时间分布
&amp;#34;TTFB (首字节时间)&amp;#34; : 15
&amp;#34;内容下载 (HTML/CSS)&amp;#34; : 20
&amp;#34;DOM 解析与渲染&amp;#34; : 45
&amp;#34;分析与第三方 JS&amp;#34; : 20
&lt;/pre>
&lt;p>第三方JS分析工具占据总加载时间约20%到30%的情况也并不少见。&lt;/p>
&lt;h3 id="72-引入cloudflare-web-analytics">7.2 引入Cloudflare Web Analytics
&lt;/h3>&lt;p>因此，像Cloudflare Web Analytics或Plausible Analytics这样，不使用Cookie（Cookieless）且隐私优先的访问分析工具正受到瞩目。&lt;/p>
&lt;p>Cloudflare Web Analytics只需嵌入一个非常轻量的JavaScript片段即可运行，由于不生成Cookie，因此无需设置烦人的Cookie同意横幅（Cookie Consent Banner）。&lt;/p>
&lt;p>在Hugo中的实现也非常简单。只需在 &lt;code>layouts/partials/head.html&lt;/code> 或 &lt;code>layouts/partials/analytics.html&lt;/code> 中添加提供的代码片段即可。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">{{ if eq hugo.Environment &amp;#34;production&amp;#34; }}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&amp;lt;!-- Cloudflare Web Analytics --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span> &lt;span class="na">defer&lt;/span> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#39;https://static.cloudflareinsights.com/beacon.min.js&amp;#39;&lt;/span> &lt;span class="na">data-cf-beacon&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#39;{&amp;#34;token&amp;#34;: &amp;#34;YOUR_CLOUDFLARE_BEACON_TOKEN&amp;#34;}&amp;#39;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&amp;lt;!-- End Cloudflare Web Analytics --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{ end }}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>通过添加 &lt;code>defer&lt;/code> 属性，可以异步加载脚本而不阻塞HTML的解析，并在DOM构建完成后执行。这样可以把对初始显示速度（LCP: Largest Contentful Paint 和 FCP: First Contentful Paint）的影响降到最低。&lt;/p>
&lt;hr>
&lt;h2 id="8-总结与最佳实践">8. 总结与最佳实践
&lt;/h2>&lt;p>在使用Hugo运营静态网站时，采用像Cloudflare Pages和GitHub Pages这样现代的托管平台，在性价比、加载速度和安全性方面都具有压倒性的优势。&lt;/p>
&lt;ol>
&lt;li>&lt;strong>极速构建&lt;/strong>: 发挥Hugo的高速特性，将CI/CD流水线（GitHub Actions）的执行时间降至最低。&lt;/li>
&lt;li>&lt;strong>边缘分发&lt;/strong>: 利用Cloudflare的边缘网络，以毫秒级的延迟将内容分发给全球用户。&lt;/li>
&lt;li>&lt;strong>适当的DNS配置&lt;/strong>: 运用CNAME Flattening安全且高速地运营Zone Apex（自定义域名）。&lt;/li>
&lt;li>&lt;strong>优化缓存策略&lt;/strong>: 使用 &lt;code>_headers&lt;/code> 针对各类资源合理分离浏览器缓存和边缘缓存。&lt;/li>
&lt;li>&lt;strong>轻量级分析&lt;/strong>: 引入兼顾隐私且不损耗性能的Cloudflare Web Analytics等工具。&lt;/li>
&lt;/ol>
&lt;p>通过将这些实践结合起来，即可免费构建一个足以应对每月数百万PV级别大规模流量的、可扩展且坚固的博客系统。如果您正在考虑搭建技术博客、企业网站或个人作品集网站，请务必尝试一下这种 Jamstack + Hugo + Cloudflare Pages 的架构。&lt;/p></description></item></channel></rss>