【前情提要】
方言课补完了,小林终于可以安心搭博客了。老周说:“第一个项目,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
“成了。”小林松了口气。
排错思路总结:
brew install成功,但命令找不到,先检查 PATH。- 如果 PATH 正确,检查
brew info hugo,看是否有keg-only提示。 keg-only表示 Homebrew 没有自动链接到/opt/homebrew/bin。- 解决:
brew link hugo --force,或者直接用完整路径。 - 另一个可能:装的是
hugo而非hugo-extended,某些主题需要 extended 版本。用brew install hugo默认装 extended,但如果之前装过普通版,需要brew uninstall hugo && brew install hugo。
“记住,”老周说,“Mac 上装软件,报 command not found,90% 是 PATH 问题,10% 是 keg-only 没链接。 你先查这两个,基本都能解决。”
六、练习
- 练习一:在 Ubuntu 里用二进制方式安装 Hugo,验证
hugo version输出包含linux/arm64。然后在 Mac 上用 Homebrew 安装 Hugo,验证输出包含darwin/arm64。 - 练习二:在 Ubuntu 里创建站点
myblog,修改hugo.toml,把baseURL改为http://localhost:1313/,languageCode改为zh-cn,title改为你的名字。运行hugo server,用浏览器访问http://localhost:1313,确认标题正确。 - 练习三:在
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 只要三分钟》