Hugo 网站优化(9): 实施更新与缓存加速兼顾, 使用 Github Action 主动预热 CDN 缓存

原文链接: https://tangx.in/posts/2023/01/04/hugo-qcloud-cdn-purge-and-push/

Github Page 实现的 纯静态 网站加 CDN 就是麻烦。

  1. 缓存时间设置短了, 回源网站打开慢。
  2. 缓存时间设置长了, 发布新文章又很长时间无法展示。

于是, 我又盯上了 Github Action 的实现发布文章后主动预热网站, 这样在 CDN 中的缓存配置就更通用了。

cdn-node-cache

实际上, 这里可以设置为全站 90 天, 或者更长时间。

先说逻辑

本来整条链路应该是像下面这样串行的。

1
2
# 1. 串行逻辑
hugo --推送--> github --发布--> website --触发--> CDN 刷新后预热

但是, 由于种种无法控制的因素, 无法实现

  1. Github 自定义 发布网站的 action 配置真的是太难了, 文档看了好久都没实践出来。
  2. 腾讯云CDN 刷新 完成时间不定,
    1. 根据 刷新内容多少 以及 其他不可控因素 相关。
    2. 由于 Github Action 的个人配额有时长限制, 无法一直等待。 另外 刷新预热 都是异步任务, 串行等待太浪费。

因此, 将逻辑改成了

1
2
3
4
5
6
# 1. 发布
hugo --推送--> github --发布--> website
                     └--等待--> CDN 刷新 + 预热

# 2. 定时任务
github --定时任务--> 预热

站点地图(sitemap)

sitemap 是我们的站点地图, 用于给搜索引擎网站的地址清单, 便于收录。

sitemap 具有固定的结构

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<urlset>
    <url>
        <loc>https://tangx.in/categories/</loc>
        <lastmod>2023-01-04T08:09:37+08:00</lastmod>
        <changefreq>daily</changefreq>
        <priority>0.8</priority>
    </url>
    <url>
        <loc>https://tangx.in/tags/kubernetes/</loc>
        <lastmod>2023-01-03T18:15:50+08:00</lastmod>
        <changefreq>daily</changefreq>
        <priority>0.8</priority>
    </url>
</urlset>

更多细节可以参考官网的 SiteMap 协议

在 sitemap 中可以看到

  1. loc: 目标网址
  2. lastmod: 最后更新时间

这两个字段对我们刷新网站很重要。

确定刷新和预热的内容

sitemap 中可以得到所有的页面地址, 豪横一点就全部刷新了。

话虽这样说, 但事不能这样做。

结合字段 lastmod, 判断最后更新时间在 N 天内就更新。

这里就需要养成良好的书写习惯, 每次更新都要修改文档的最后更新时间。

以下是文章的元数据信息

1
2
3
4
5
6
---
title: "Hugo 网站优化(9): 预热网站, 使用 Github Action 主动刷新 DNS 缓存"
subtitle: "Hugo Qcloud Cdn Purge And Push"
date: "2023-01-04T16:35:49+08:00"
lastmod: "2023-01-04T16:35:49+08:00"
---

腾讯云实现刷新和预热工具

不得不说, 现在大厂的业务能力真的太好的。 简单 API 调用功能, 基本可以直接复制 DEMO, 稍微修改修改就可以用了。

Github Action 定时任务

Github Action 定时任务触发事件是根据 UTC 时间。 不能 设置 触发 时区。

换句话说, 如果想要实现 CST 触发时区, 需要自行计算 cron 的时间配置。

以下是 预热 网站的 workflow 配置

1
2
3
4
5
6
7
8
9
on:
  push:
    branches:
      - master
      - main
 schedule:
    #  UTC 16:00 -> CST 00:00
    # - cron: "10 17 * * *"  # UTC 17:00 -> CST 01:00 (day+1)
    - cron: "31 * * * *" # 每小时预热

我们这里设置为 每小时预热 网站一次

工具下载

关注公众号, 回复 博客CDN刷新 , 获取最新版本工具下载地址和使用方式。

点个赞, 关注一下呗。