Hugo vs Hexo:我为什么选择 Caddy 作为静态站点服务器

这个博客之前是用 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 的组合,让我的博客维护成本降到了最低。写文章、推送、自动部署,整个流程非常流畅。如果你也在考虑搭建个人博客,推荐试试这个方案。

Hugo Caddy Docker