前情:
在上一篇建站记录系列文章中,我们为博客源服务器配置了CDN加速,但是实际使用中发现,我们推送代码,自动构建生成的新包发到服务器后,我们使用域名访问站点,内容缺没有更新,这是为什么呢?实际上是因为站点资源更新后,CDN没有及时回源进行缓存刷新。
我使用的CDN产品是在腾讯云搞活动买服务器时顺便买的EdgeOne,好像是50块钱一年,据说是新一代的CDN,多了DDos攻击防御和CC攻击功能,但是我用的是活动版就享受不到这些功能了,估计等这个到期了还是要换回更便宜的常规CDN,这个正常价续费太贵了,我等一般人实在用不起啊。😂,下面就以EdgeOne为例,记录下我的优化过程。
两种实现思路:
- 在服务器端监听文件变化,如果有文件推送,则调用腾讯云API刷新CDN缓存;
- 通过GithubAction实现:在代码推送到远程仓库后,触发Action工作流,调用腾讯云API实现CDN缓存刷新;
相关知识补充:
1.什么是腾讯云API?
在本文的需求中,腾讯云API是实现CDN缓存刷新的关键工具,它是腾讯云提供的实现其一系列产品操作的网络接口,通过调用这些接口,开发者可以实现自己想要的功能,比如我们想要实现的CDN在代码推送后的自动刷新;
2.什么是腾讯云SDK?
腾讯云SDK是腾讯云开发团队对其API的再次封装,包括各种语言,参考官网的截图,本文使用了其中的Nodejs版本,通过SDK调用API更方便,只需关注参数,不用关注更多API请求、数据格式层面的细节。

动手实践:
💡关于GithubAction的使用在我之前的文章有介绍,不了解的读者可以先移步阅读:https://cyanfish.site/bdd56b8f
关键代码:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 
 | ClearCDNCache:
 needs: scpToServer
 runs-on: ubuntu-latest
 steps:
 - name: Checkout code
 uses: actions/checkout@v3
 
 - name: Set up Node.js
 uses: actions/setup-node@v3
 with:
 node-version: '16'
 
 - name: Install dependencies
 run: npm install tencentcloud-sdk-nodejs
 
 - name: Purge Cache with Tencent SDK
 env:
 TENCENT_CLOUD_SECRET_ID: ${{ secrets.TENCENT_CLOUD_SECRET_ID }}
 TENCENT_CLOUD_SECRET_KEY: ${{ secrets.TENCENT_CLOUD_SECRET_KEY }}
 run: |
 # 创建一个临时的 JS 文件用于执行腾讯云 API 请求
 echo 'const tencentcloud = require("tencentcloud-sdk-nodejs");' > clearCache.js
 echo 'const TeoClient = tencentcloud.teo.v20220901.Client;' >> clearCache.js
 echo 'const clientConfig = {' >> clearCache.js
 echo '  credential: {' >> clearCache.js
 echo '    secretId: process.env.TENCENT_CLOUD_SECRET_ID,' >> clearCache.js
 echo '    secretKey: process.env.TENCENT_CLOUD_SECRET_KEY,' >> clearCache.js
 echo '  },' >> clearCache.js
 echo '  region: "ap-chengdu",' >> clearCache.js
 echo '  profile: {' >> clearCache.js
 echo '    httpProfile: {' >> clearCache.js
 echo '      endpoint: "teo.tencentcloudapi.com",' >> clearCache.js
 echo '    },' >> clearCache.js
 echo '  },' >> clearCache.js
 echo '};' >> clearCache.js
 
 echo 'const client = new TeoClient(clientConfig);' >> clearCache.js
 echo 'const params = {' >> clearCache.js
 echo '  Targets: ["www.yourdomin.com"],' >> clearCache.js
 echo '  Type: "purge_host",' >> clearCache.js
 echo '  ZoneId: "yourSiteZoneId",' >> clearCache.js
 echo '};' >> clearCache.js
 
 echo 'client.CreatePurgeTask(params).then(' >> clearCache.js
 echo '  (data) => {' >> clearCache.js
 echo '    console.log(data);' >> clearCache.js
 echo '  },' >> clearCache.js
 echo '  (err) => {' >> clearCache.js
 echo '    console.error("error", err);' >> clearCache.js
 echo '  }' >> clearCache.js
 echo ');' >> clearCache.js
 
 
 node clearCache.js
 
 | 
项目根目录下的.github/workflows/xxx.yml中的自动打包部署工作流完整代码如下:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 
 | name: 构建&分发on:
 push:
 branches:
 - main
 jobs:
 
 build:
 runs-on: ubuntu-latest
 steps:
 - uses: actions/checkout@v3
 with:
 token: ${{ secrets.GITHUB_TOKEN }}
 
 submodules: recursive
 - name: 安装Node
 uses: actions/setup-node@v2
 with:
 node-version: '16'
 - name: 安装依赖
 run: npm install
 - name: 缓存依赖
 uses: actions/cache@v2
 with:
 path: node_modules
 key: ${{ runner.OS }}-npm-cache
 restore-keys: |
 ${{ runner.OS }}-npm-cache
 - name: 构建
 run: npm run build
 - name: Create artifact
 uses: actions/upload-artifact@v3
 with:
 name: buildPakage
 path: ./public
 
 
 scpToServer:
 needs: build
 runs-on: ubuntu-latest
 steps:
 - name: Download artifact
 uses: actions/download-artifact@v3
 with:
 name: buildPakage
 path: public
 - name: copy file via ssh key
 uses: appleboy/scp-action@v0.1.7
 with:
 host: ${{ secrets.SERVER_HOST }}
 username: ${{ secrets.SERVER_USERNAME }}
 port: 22
 key: ${{ secrets.SSH_PRIVATE_KEY }}
 source: "public/*"
 target: '${{ secrets.SERVER_DEPLOY_DIR }}'
 rm: true
 
 
 ClearCDNCache:
 needs: scpToServer
 runs-on: ubuntu-latest
 steps:
 - name: Checkout code
 uses: actions/checkout@v3
 
 - name: Set up Node.js
 uses: actions/setup-node@v3
 with:
 node-version: '16'
 
 - name: Install dependencies
 run: npm install tencentcloud-sdk-nodejs
 
 - name: Purge Cache with Tencent SDK
 env:
 TENCENT_CLOUD_SECRET_ID: ${{ secrets.TENCENT_CLOUD_SECRET_ID }}
 TENCENT_CLOUD_SECRET_KEY: ${{ secrets.TENCENT_CLOUD_SECRET_KEY }}
 run: |
 # 创建一个临时的 JS 文件用于执行腾讯云 API 请求
 echo 'const tencentcloud = require("tencentcloud-sdk-nodejs");' > clearCache.js
 echo 'const TeoClient = tencentcloud.teo.v20220901.Client;' >> clearCache.js
 echo 'const clientConfig = {' >> clearCache.js
 echo '  credential: {' >> clearCache.js
 echo '    secretId: process.env.TENCENT_CLOUD_SECRET_ID,' >> clearCache.js
 echo '    secretKey: process.env.TENCENT_CLOUD_SECRET_KEY,' >> clearCache.js
 echo '  },' >> clearCache.js
 echo '  region: "ap-chengdu",' >> clearCache.js
 echo '  profile: {' >> clearCache.js
 echo '    httpProfile: {' >> clearCache.js
 echo '      endpoint: "teo.tencentcloudapi.com",' >> clearCache.js
 echo '    },' >> clearCache.js
 echo '  },' >> clearCache.js
 echo '};' >> clearCache.js
 
 echo 'const client = new TeoClient(clientConfig);' >> clearCache.js
 echo 'const params = {' >> clearCache.js
 echo '  Targets: ["www.yourdomin.com"],' >> clearCache.js
 echo '  Type: "purge_host",' >> clearCache.js
 echo '  ZoneId: "yourSiteZoneId",' >> clearCache.js
 echo '};' >> clearCache.js
 
 echo 'client.CreatePurgeTask(params).then(' >> clearCache.js
 echo '  (data) => {' >> clearCache.js
 echo '    console.log(data);' >> clearCache.js
 echo '  },' >> clearCache.js
 echo '  (err) => {' >> clearCache.js
 echo '    console.error("error", err);' >> clearCache.js
 echo '  }' >> clearCache.js
 echo ');' >> clearCache.js
 
 
 node clearCache.js
 
 | 
题外:
如果不使用腾讯云SDK,也可以直接在bash环境中直接使用curl工具发送请求,笔者最先尝试的就是这个方式,但是中途遇到生成签名的问题难以解决,恰巧又发现了有sdk这个好东西,于是放弃了该思路,有兴趣有时间的同学可以自行研究探索。以下是相关不完整的代码:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 
 | ClearCDNCache:
 runs-on: ubuntu-latest
 steps:
 - name: Checkout code
 uses: actions/checkout@v3
 
 - name: Generate Signature
 id: generate_signature
 run: |
 # 获取当前时间戳和日期
 TIMESTAMP=$(date +%s)
 DATE=$(date -u +%Y-%m-%d)
 
 
 SECRET_ID=${{ secrets.TENCENT_CLOUD_SECRET_ID }}
 SECRET_KEY=${{ secrets.TENCENT_CLOUD_SECRET_KEY }}
 REGION="ap-chengdu"
 SERVICE="teo"
 
 
 CANONICAL_REQUEST="POST\n/\n\nhost:teo.tencentcloudapi.com\ncontent-type:application/json\n\nhost;content-type\nUNSIGNED-PAYLOAD"
 STRING_TO_SIGN="TC3-HMAC-SHA256\n${TIMESTAMP}\n${DATE}/${REGION}/${SERVICE}/tc3_request\n$(echo -n "${CANONICAL_REQUEST}" | sha256sum | awk '{print $1}')"
 
 
 SIGNING_KEY=$(echo -n "${DATE}/${REGION}/${SERVICE}/tc3_request" | openssl dgst -sha256 -hmac "${SECRET_KEY}" -binary | xxd -p)
 
 
 SIGNATURE=$(echo -n "${STRING_TO_SIGN}" | openssl dgst -sha256 -hmac "${SIGNING_KEY}" | awk '{print $2}')
 
 
 echo "SIGNATURE=${SIGNATURE}" >> $GITHUB_ENV
 echo "TIMESTAMP=${TIMESTAMP}" >> $GITHUB_ENV
 echo "DATE=${DATE}" >> $GITHUB_ENV
 echo "REGION=${REGION}" >> $GITHUB_ENV
 
 - name: Purge Cache
 run: |
 # 设置变量
 SITE_HOST="yourSiteZoneID"
 
 
 curl -X POST https://teo.tencentcloudapi.com/ \
 -H "Content-Type: application/json" \
 -H "X-TC-Version:2022-09-01" \
 -H "X-TC-Action: CreatePurgeTask" \
 -H "X-TC-Timestamp: ${{ env.TIMESTAMP }}" \
 -H "X-TC-Region: ${{ env.REGION }}" \
 -H "Authorization: TC3-HMAC-SHA256 Credential=${{ secrets.TENCENT_CLOUD_SECRET_ID }}/${{ env.DATE }}/${{ env.REGION }}/${{ secrets.SERVICE }}/tc3_request, SignedHeaders=host;content-type, Signature=${{ env.SIGNATURE }}" \
 -d "{
 \"Targets\": [\"yourDomin\"],
 \"Type\": \"purge_host\",
 \"ZoneId\": \"${SITE_HOST}\"
 }"
 
 |