【前情提要】 方言课补完了,小林终于可以安心搭博客了。老周说:“第一个项目,Hugo 博客。你先在 Ubuntu 里把 Hugo 装上,然后把 PaperMod 主题克隆下来。”小林打开终端,敲下 git clone,以为一切顺利。

一、老周派活了

周一早上,小林刚坐下,老周就端着保温杯走过来,往他桌上放了一张便利贴。

上面写着四个字:

搭个博客

小林抬头:“就……就这四个字?”

“对。”老周说,“公司内部技术分享,以前都发在群里,翻记录翻半天。领导说搞个博客,大家写文章方便。我给你三天,搭起来就行。”

“用 WordPress?”

“不用。”老周摇头,“WordPress 要 PHP、要 MySQL,你三天搞不定。用 Hugo。”

“Hugo?”

“静态网站生成器。”老周说,“你把文章写成 Markdown,Hugo 把它变成 HTML。不需要数据库,不需要 PHP,一个二进制文件搞定。部署简单,速度快,还安全。”

小林打开 Hugo 官网,看到一行大字:

The world's fastest framework for building websites

“世界上最快?”小林眼睛亮了。

“别被宣传语忽悠。”老周说,“快是真的,但你要学的东西不少。今天先把 Hugo 装上,把站点跑起来。明天搞主题,后天配 Nginx。三天,刚好。”

小林点点头,打开 SSH,连上 Ubuntu。

二、Hugo 是什么?为什么不用 WordPress?

老周拉过椅子,决定先给小林讲清楚“为什么”。

“你先说说,你觉得博客应该怎么搭?”

小林想了想:“装个 WordPress,买个域名,找个主机,后台点点点?”

“那是普通人的做法。”老周说,“WordPress 确实简单,但它有几个问题。”

他竖起三根手指。

第一,要数据库。

“WordPress 的文章存在 MySQL 里。你备份博客,得备份数据库。数据库挂了,博客就挂了。你入门阶段,多一个组件,多十个坑。”

第二,要 PHP。

“WordPress 是 PHP 写的。PHP 版本、扩展、权限,每一个都可能出问题。你还没学 PHP 呢,先被 PHP 折腾三天。”

第三,不安全。

“WordPress 是黑客重点照顾对象。插件漏洞、主题漏洞、弱密码,三天两头被扫。你搭个内部博客,结果被挖矿了,老周我脸上挂不住。”

小林笑了:“那 Hugo 呢?”

“Hugo 是静态网站生成器。”老周说,“你写 Markdown,Hugo 生成 HTML。生成的 HTML 就是一堆静态文件,谁都能托管。没有数据库,没有 PHP,没有后台。安全、快、简单。”

“那怎么发文章?”

“本地写好 Markdown,跑一下 hugo,生成 HTML,传到服务器。或者直接在服务器上写,跑一下 hugo,Nginx 直接指向生成的目录。”

“这么简单?”

“就这么简单。”老周说,“你三天能搞定,就是因为 Hugo 省掉了数据库和 PHP。入门阶段,少一个组件,少十个坑。”

小林在笔记本上写下:

  • Hugo:静态网站生成器
  • 输入:Markdown
  • 输出:HTML
  • 优势:无数据库、无 PHP、安全、快、部署简单

三、在 Ubuntu 里安装 Hugo

“好,开始装。”老周说,“Ubuntu 上装 Hugo,有几种方式。apt、snap、二进制。我推荐二进制。”

“为啥不用 apt?”

“Ubuntu 的 apt 源里,Hugo 版本可能比较旧。”老周说,“Hugo 更新很快,新版本支持新特性。你用 apt 装,可能装到一年前的版本。二进制安装,直接下最新版,干净。”

“那 snap 呢?”

“snap 也行,但 snap 有时候路径奇怪,而且启动慢。”老周说,“二进制最稳。”

老周让小林先看架构:

uname -m

输出:

aarch64

“看到了吗?aarch64,就是 ARM64。”老周说,“你下 Hugo 的 ARM64 版本。”

小林打开 Hugo 的 GitHub Releases 页面,找到最新版本,下载 ARM64 的 .tar.gz 包。

“用 wget 下。”老周说,“你 Ubuntu 里可能没装 wget,先装。”

sudo apt update
sudo apt install -y wget

“apt update 是更新软件源索引,apt install 是安装。-y 是自动确认,不然它问你‘是否继续’,你还得敲 y。”老周解释。

小林敲:

wget https://github.com/gohugoio/hugo/releases/download/v0.x.x/hugo_extended_0.x.x_linux-arm64.tar.gz

下载完成后,解压:

tar -xzvf hugo_extended_0.x.x_linux-arm64.tar.gz

解压出来一个 hugo 文件。

“把它放到 /usr/local/bin/。”老周说。

sudo mv hugo /usr/local/bin/

“然后验证:”

hugo version

输出:

hugo v0.x.x+extended linux/arm64

“成了。”小林说。

“注意看 linux/arm64。”老周说,“你 Mac 上是 darwin/arm64,Ubuntu 上是 linux/arm64。平台不同,架构相同。以后你下软件,先看这两个。”

四、创建第一个站点

“现在创建站点。”老周说。

小林敲:

hugo new site myblog

输出:

Congratulations! Your new Hugo site was created in /home/devops/myblog.

“进去看看。”

cd myblog
ls -la

输出:

archetypes/
assets/
content/
data/
hugo.toml
layouts/
static/
themes/

“这些目录都是干啥的?”小林问。

老周一个一个指:

  • archetypes/:文章模板。你 hugo new 创建文章时,会套用这里的模板。
  • assets/:需要 Hugo 处理的资源,比如 SCSS、JS。入门阶段先不管。
  • content/:你的文章放这里,Markdown 文件。
  • data/:结构化数据,入门阶段先不管。
  • hugo.toml:站点配置文件。标题、URL、主题、菜单,都在这。
  • layouts/:模板文件。主题会覆盖这里,入门阶段先不管。
  • static/:静态文件,图片、CSS、JS 放这里,直接复制到生成的站点。
  • themes/:主题目录。你以后把 PaperMod 放这里。

“你现在只需要关心三个:content/、hugo.toml、themes/。”老周说,“其他先放着。”

小林点头。

“现在跑起来看看。”

hugo server

输出:

Web Server is available at http://localhost:1313/ (bind address 127.0.0.1)
Press Ctrl+C to stop

“打开浏览器,访问 http://localhost:1313。”

小林在 Ubuntu 里打开 Firefox,输入地址。页面出来了,但一片空白,只有一行字:

My New Hugo Site

“丑吧?”老周笑了,“正常,还没装主题。你先停掉。”

小林按 Ctrl+C,服务停了。

“今天先把站点跑起来,明天装主题。”老周说,“你先熟悉一下 hugo.toml,把 baseURL 改成 http://localhost:1313/,把 title 改成你想要的。”

小林打开 hugo.toml:

nano hugo.toml

内容:

baseURL = 'https://example.org/'
languageCode = 'en-us'
title = 'My New Hugo Site'

小林改成:

baseURL = 'http://localhost:1313/'
languageCode = 'zh-cn'
title = '小林的技术博客'

保存,退出。

“再跑一下。”

hugo server

浏览器刷新,标题变成“小林的技术博客”。

“成了。”小林满意地说。

五、排错挑战:hugo 命令找不到

下午,小林想在自己的 Mac 上也装一个 Hugo,方便本地预览。他记得 Mac 上用 Homebrew 装:

brew install hugo

装完之后,敲:

hugo version

输出:

zsh: command not found: hugo

“啥?”小林懵了,“我明明装了啊。”

他检查 Homebrew:

brew list | grep hugo

输出:

hugo

“装了,但命令找不到。”小林挠头。

他想起老周说的 PATH,检查:

echo $PATH

输出:

/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

“/opt/homebrew/bin 在 PATH 里啊。”小林更懵了。

他仔细看 brew install hugo 的输出,发现一行:

==> Caveats
hugo is keg-only, which means it was not symlinked into /opt/homebrew,
because this is an alternate version of another formula.

“keg-only?”小林不懂。

他喊来老周。

老周看了一眼:“哦,你装的是 hugo 的某个版本,可能是 hugo 和 hugo-extended 冲突了,Homebrew 没有把它链接到 /opt/homebrew/bin。”

“那怎么办?”

“两种办法。”老周说,“第一,直接 brew link hugo --force,强制链接。第二,用完整路径 /opt/homebrew/opt/hugo/bin/hugo。”

小林试了:

brew link hugo --force

输出:

Linking /opt/homebrew/Cellar/hugo/0.x.x... 5 symlinks created.

再次敲:

hugo version

输出:

hugo v0.x.x+extended darwin/arm64

“成了。”小林松了口气。

排错思路总结:

  1. brew install 成功,但命令找不到,先检查 PATH。
  2. 如果 PATH 正确,检查 brew info hugo,看是否有 keg-only 提示。
  3. keg-only 表示 Homebrew 没有自动链接到 /opt/homebrew/bin。
  4. 解决:brew link hugo --force,或者直接用完整路径。
  5. 另一个可能:装的是 hugo 而非 hugo-extended,某些主题需要 extended 版本。用 brew install hugo 默认装 extended,但如果之前装过普通版,需要 brew uninstall hugo && brew install hugo。

“记住,”老周说,“Mac 上装软件,报 command not found,90% 是 PATH 问题,10% 是 keg-only 没链接。 你先查这两个,基本都能解决。”

六、练习

  1. 练习一:在 Ubuntu 里用二进制方式安装 Hugo,验证 hugo version 输出包含 linux/arm64。然后在 Mac 上用 Homebrew 安装 Hugo,验证输出包含 darwin/arm64。
  2. 练习二:在 Ubuntu 里创建站点 myblog,修改 hugo.toml,把 baseURL 改为 http://localhost:1313/,languageCode 改为 zh-cn,title 改为你的名字。运行 hugo server,用浏览器访问 http://localhost:1313,确认标题正确。
  3. 练习三:在 content/ 目录下创建一个 about.md,用 hugo new about.md 命令。打开文件,修改 title 为“关于我”,draft 改为 false,写入一段自我介绍。重新运行 hugo server,访问 http://localhost:1313/about/,确认页面显示。

参考答案

练习一:

Ubuntu:

uname -m   # 输出 aarch64
wget https://github.com/gohugoio/hugo/releases/download/v0.x.x/hugo_extended_0.x.x_linux-arm64.tar.gz
tar -xzvf hugo_extended_0.x.x_linux-arm64.tar.gz
sudo mv hugo /usr/local/bin/
hugo version   # 输出包含 linux/arm64

Mac:

brew install hugo
hugo version   # 输出包含 darwin/arm64

练习二:

hugo new site myblog
cd myblog
nano hugo.toml

修改为:

baseURL = 'http://localhost:1313/'
languageCode = 'zh-cn'
title = '小林的技术博客'
hugo server

浏览器访问 http://localhost:1313,标题显示“小林的技术博客”。

练习三:

hugo new about.md
nano content/about.md

修改 front matter:

---
title: "关于我"
date: 2026-09-13T10:00:00+08:00
draft: false
---

写入:

我是小林,一名刚入行的运维工程师。喜欢折腾 Linux,正在学习监控和日志分析。
hugo server

访问 http://localhost:1313/about/,页面显示自我介绍。

七、下集预告

Hugo 装好了,站点跑起来了,hugo.toml 也改好了。老周说:“明天装主题,PaperMod。你先把主题克隆下来,改改配置。”小林打开终端,敲下 git clone,以为一切顺利。但他不知道,主题的 hugo.toml 配置、菜单路径、baseURL 的斜杠,每一个都可能让他折腾半小时。

下一集:《选主题比选衣服难,但 PaperMod 只要三分钟》