前言

上一篇文章中,我们搭建了一个基于 Hugo + GitHub Actions 的自动化博客。虽然能正常访问,但存在一些问题:

  • 服务器带宽有限,访问速度受限
  • 源站 IP 直接暴露,容易成为攻击目标
  • 没有缓存机制,每次都回源增加服务器负担
  • 跨地域访问延迟高

本文记录了为博客配置阿里云 CDN 的完整过程,以及踩过的坑和解决方案。

为什么需要 CDN?

CDN 的工作原理

CDN (Content Delivery Network) 内容分发网络,简单来说就是在用户和源站之间加了一层代理缓存:

传统架构:
用户 → 源站服务器(单点,慢)

CDN 架构:
用户 → 就近的 CDN 节点 → 源站服务器
       ↑ 缓存静态资源

CDN 的核心优势

1. 性能提升

  • 全国数百个节点,用户访问就近节点
  • 静态资源缓存,减少回源请求
  • 实测:页面加载速度提升 3-5 倍

2. 安全防护

  • 隐藏源站真实 IP
  • 自带 DDoS 防护
  • 防止恶意扫描和攻击

3. 成本优化

  • 减少源站带宽消耗
  • 按量付费,个人博客成本极低(~5-10元/月)

4. 可用性保障

  • 单节点故障自动切换
  • 抗流量突发能力强

准备工作

前置条件

  • 已部署的 Hugo 博客(可参考上一篇文章)
  • 已备案的域名(国内 CDN 必须)
  • 阿里云账号(或其他云服务商)

架构规划

最终架构:

用户浏览器 (HTTPS)
    ↓
CDN 节点 (全国分布)
    ↓ HTTP 回源
源站服务器 (隐藏)

关键设计:

  • CDN 对外提供 HTTPS(443端口)
  • 回源使用 HTTP(80端口)
  • 源站不对外暴露,只接受 CDN 回源

配置步骤

第一步:创建 CDN 加速域名

1.1 登录阿里云 CDN 控制台

访问 阿里云 CDN 控制台

1.2 添加加速域名

点击"添加域名",配置以下信息:

基础配置:

加速域名:blog.你的域名.com
业务类型:图片小文件(静态网站选这个)
源站信息:IP(填写你的服务器IP)
端口:80
加速区域:仅中国内地

业务类型选择说明:

  • 图片小文件:网站、博客、小图片(推荐)
  • 大文件下载:软件安装包、固件(> 20MB)
  • 视音频点播:视频网站(不适合博客)

第二步:配置缓存策略

合理的缓存策略能大幅提升命中率和性能。

2.1 推荐的缓存规则

点击"缓存配置" → “添加”,按优先级配置:

规则 1:HTML 文件

类型:文件后缀
地址:html
过期时间:10 分钟
权重:90

原因: 博客内容更新频繁,10分钟缓存平衡性能与实时性


规则 2:CSS 和 JS

类型:文件后缀
地址:css,js
过期时间:7 天
权重:85

原因: 样式和脚本不常变,长缓存节省流量


规则 3:图片

类型:文件后缀
地址:jpg,jpeg,png,gif,webp,svg,ico
过期时间:30 天
权重:85

规则 4:字体

类型:文件后缀
地址:woff,woff2,ttf,eot
过期时间:365 天
权重:85

规则 5:默认兜底

类型:目录
地址:/
过期时间:1 小时
权重:99

权重说明: 数字越小优先级越高,匹配规则从高到低。

2.2 其他性能配置

开启压缩:

☑ 开启 Gzip 压缩

效果:文本文件压缩率 70-80%,显著提升加载速度

忽略 URL 参数:

☑ 忽略参数:是

效果:提高缓存命中率(page.html?v=1page.html?v=2 使用同一份缓存)

第三步:配置 HTTPS 证书

3.1 证书来源选择

有两种方式:

方式 A:上传服务器证书(推荐)

如果你的服务器已经申请了 Let’s Encrypt 证书:

  1. SSH 登录服务器
  2. 找到证书文件(通常在 /etc/letsencrypt/ 或站点 SSL 目录)
  3. 复制 fullchain.pem(证书) 和 privkey.pem(私钥)
  4. 在 CDN 控制台选择"自定义上传",粘贴内容

方式 B:使用云厂商免费证书

阿里云提供免费 DV 证书(单域名,1年有效期):

证书来源:云盾 SSL 证书
证书类型:免费证书

3.2 强制 HTTPS

配置证书后,开启以下选项:

☑ 强制跳转 HTTPS(HTTP 自动 301 到 HTTPS)
☑ 开启 HTTP/2
☑ 开启 HSTS(可选,增强安全性)

第四步:安全配置

4.1 防盗链配置

防止其他网站盗用你的图片和资源。

Referer 白名单:

类型:白名单
白名单列表:
  - blog.你的域名.com
  - 你的域名.com
  - *.你的域名.com

☑ 允许空 Referer

说明:

  • 白名单:只允许列表中的域名访问
  • 允许空 Referer:用户可以直接在浏览器打开图片链接

4.2 用量封顶(重要!)

防止恶意刷流量导致天价账单。

流量封顶:

统计周期:自然日
流量阈值:10 GB/天

带宽封顶:

带宽阈值:10 Mbps

说明:

  • 个人博客正常流量:1-2 GB/月
  • 10 GB/天是安全缓冲值
  • 超过阈值会自动下线域名(不产生费用)

第五步:修改 DNS 解析

5.1 获取 CNAME 地址

配置完成后,CDN 会分配一个 CNAME 地址:

blog.你的域名.com.w.kunlunaq.com

5.2 修改域名解析

登录域名 DNS 管理(如阿里云、腾讯云):

删除旧的 A 记录:

主机记录:blog
记录类型:A
记录值:你的服务器IP

操作:删除 ❌

添加 CNAME 记录:

记录类型:CNAME
主机记录:blog
记录值:blog.你的域名.com.w.kunlunaq.com
TTL:10分钟

5.3 验证生效

等待 5-10 分钟,检查 DNS:

dig blog.你的域名.com

# 应该看到 CNAME 记录
blog.你的域名.com. 600 IN CNAME xxxx.w.kunlunaq.com.

常见问题与解决

问题 1:重定向循环(ERR_TOO_MANY_REDIRECTS)

现象:

访问网站时浏览器报错:
"该网页无法正常运作,将您重定向的次数过多"

原因分析:

这是最常见的问题!根本原因是:

1. CDN 用 HTTP 访问源站(回源协议)
2. 源站配置了强制 HTTPS 跳转
3. 源站返回 301 让 CDN 访问 HTTPS
4. CDN 再次用 HTTP 回源
5. 无限循环 ❌

解决方案:关闭源站的强制 HTTPS

CDN 已经对外提供 HTTPS 了,源站不需要再强制跳转。

Nginx 配置示例:

删除或注释掉这段:

# 删除这段配置
if ($scheme = http) {
    return 301 https://$host$request_uri;
}

1panel / 宝塔面板:

  • 进入网站配置
  • 关闭"强制 HTTPS"选项
  • 或删除 SSL 监听(只保留 80 端口)

验证:

# 直接访问源站应该返回 200,不应该 301
curl -I http://你的服务器IP -H "Host: blog.你的域名.com"
# 应该看到:HTTP/1.1 200 OK

记得重载配置:

# Nginx
nginx -s reload

# Docker 容器
docker exec 容器名 nginx -s reload

问题 2:修改配置后内容没更新

原因: CDN 缓存了旧内容。

解决:

  1. 刷新 CDN 缓存

    • 阿里云 CDN 控制台
    • 进入"刷新预热"
    • URL 刷新:https://blog.你的域名.com/
    • 或目录刷新:https://blog.你的域名.com/
  2. 清除浏览器缓存

    • Cmd/Ctrl + Shift + Delete
    • 或使用无痕模式测试

问题 3:证书过期

Let’s Encrypt 证书有效期 90 天,需要定期更新。

解决:

  1. 服务器证书自动续期

    • 1panel/宝塔:自动续期
    • Certbot:配置 cron 定时任务
  2. CDN 证书需手动更新

    • 服务器续期后,导出新证书
    • 在 CDN 控制台重新上传

建议: 设置日历提醒,证书到期前 1 周更新。


问题 4:CDN 费用突增

原因: 被恶意刷流量或爬虫抓取。

排查:

# 查看服务器访问日志
tail -f /var/log/nginx/access.log

# 或通过 CDN 控制台查看流量统计

预防:

  • ✅ 配置用量封顶(10GB/天)
  • ✅ 配置 Referer 白名单
  • ✅ 配置 IP 访问限频(可选)

验证 CDN 是否生效

方法 1:检查响应头

打开浏览器开发者工具(F12) → Network 标签:

Via: cache12.l2cn3005[...](CDN 标识)
X-Cache: HIT(命中缓存)/ MISS(未命中,回源)
Server: Tengine(阿里云 CDN)

方法 2:多地 Ping 测试

使用在线工具:

应该看到全国各地响应时间都很快且均衡。

方法 3:命令行测试

# 检查 DNS 解析
dig blog.你的域名.com

# 应该看到 CNAME 记录,不是 A 记录

# 检查 HTTPS
curl -I https://blog.你的域名.com

# 应该看到 CDN 相关的响应头

性能对比

实际测试数据(个人博客):

指标CDN 前CDN 后提升
首页加载时间1.2s0.3s75%
HTML 大小50KB10KB压缩 80%
图片加载0.8s0.2s75%
TTFB300ms50ms83%

成本分析

阿里云 CDN 计费

流量计费(默认):

前 10TB:0.24 元/GB
示例:
  个人博客每月 5GB 流量
  成本:5 × 0.24 = 1.2 元/月

HTTPS 请求数:

前 1000 万次:免费
超出:0.05 元/万次
个人博客:基本在免费额度内

实际成本:5-10 元/月


总结

配置 CDN 后,博客的架构更加完善:

性能提升:

  • ✅ 全国访问速度提升 3-5 倍
  • ✅ 静态资源缓存,减少回源
  • ✅ Gzip 压缩,节省 70-80% 流量

安全加固:

  • ✅ 源站 IP 隐藏,防止直接攻击
  • ✅ DDoS 防护,抗流量攻击
  • ✅ 用量封顶,防止恶意刷量

成本优化:

  • ✅ 减少服务器带宽消耗
  • ✅ 按量付费,个人博客成本极低

最重要的经验:

  • 关闭源站的强制 HTTPS,避免重定向循环
  • 配置用量封顶,避免意外费用
  • 合理设置缓存时间,平衡性能和实时性

现在,你的博客已经具备了生产级的性能和安全性,可以安心创作了!

参考资源