这个博客之前是用 Hexo 搭建的,托管在 GitHub Pages 上。但随着文章增多,Hexo 的构建速度越来越慢,GitHub Pages 在国内的访问也不太稳定。经过一番调研,我决定迁移到 Hugo,并把部署方案从 GitHub Pages 换成了自建 Caddy 服务器。
Hugo vs Hexo
两者都是优秀的静态站点生成器,但有一些关键差异:
| 特性 | Hexo | Hugo |
|---|---|---|
| 语言 | Node.js | Go |
| 构建速度 | 较慢(100 篇约 10s) | 极快(100 篇约 0.5s) |
| 依赖管理 | 需要 node_modules | 单二进制,无依赖 |
| 主题生态 | 丰富 | 丰富 |
| 模板引擎 | EJS / Pug / Nunjucks | Go Template |
对我来说,Hugo 最大的优势是构建速度和零依赖。写完文章后 hugo 一敲,瞬间生成,不需要等待 Node.js 的依赖安装和编译。
为什么不用 GitHub Pages
GitHub Pages 虽然免费,但有几个限制:
- 国内访问速度不稳定,经常超时
- 不支持自定义 HTTPS(需要借助 Cloudflare 等 CDN)
- 仓库必须是 public
- 自定义域名配置繁琐
自建服务器虽然需要花钱,但完全可控,而且配合 Caddy 可以实现自动 HTTPS。
为什么选择 Caddy
在自建服务器的方案中,我对比了三个主流 Web 服务器:
Nginx
老牌选手,性能强劲,配置灵活。但 HTTPS 需要配合 Certbot 手动管理证书,配置文件也比较冗长。对于个人博客来说,杀鸡用牛刀了。
Apache
功能全面,.htaccess 很方便。但同样需要手动管理证书,而且内存占用比 Nginx 高。对于小博客来说过于笨重。
Caddy
Caddy 是我用过最省心的 Web 服务器。核心优势:
- 自动 HTTPS:自动申请和续签 Let's Encrypt 证书
- 极简配置:Caddyfile 只有几行
- HTTP/2 默认开启:无需额外配置
- Docker 友好:官方 Alpine 镜像只有 40MB
一个最简单的 Caddyfile:
blog.example.com {
root * /var/www/blog
file_server
}
就这几行,Caddy 会自动处理 HTTPS、HTTP→HTTPS 跳转、HTTP/2 等所有事情。
Docker 部署方案
最终的部署方案非常简单:
# 生成静态文件
hugo --minify
# Docker 启动 Caddy
docker compose up -d
更新博客时,只需在 VPS 上 git pull 拉取最新文章,重新 hugo 生成,Caddy 会自动服务新文件。
从 Hexo 迁移到 Hugo + Caddy 的组合,让我的博客维护成本降到了最低。写文章、推送、自动部署,整个流程非常流畅。如果你也在考虑搭建个人博客,推荐试试这个方案。