白嫖 AWS 小服务器,用 Hugo 把博客从零敲上线

从 Amazon 免费套餐开机器,到 Ubuntu 初始化、装 Hugo、配 Nginx,一步步把个人博客敲上线。

很早就想开始写博客了。今天也是终于动手:靠着 Amazon 新用户那点免费额度,开了一台小机器,用 Hugo + Nginx 把站搭起来。静态站不折腾数据库,刚好适合我这种「先上线再说」的性格。

下面按真实操作顺序记,命令能抄就抄。环境按当时来:

项目版本
云厂商Amazon Web Services(免费套餐)
系统Ubuntu 20.04 LTS
Hugov0.82.1 Extended
WebNginx

一、先说白嫖:Amazon 免费额度

新账号送的 Free Tier,大致能白嫖一台小 EC2 一年(每月大约 750 小时,够一台机 7×24 开着)。我选的是:

  • 系统镜像:Ubuntu Server 20.04 LTS
  • 实例规格:免费档里的 t2.micro / t3.micro(内存不大,跑静态博客绰绰有余)
  • 磁盘:先用默认那点,博客纯静态,先不纠结扩容
  • 安全组:先放行 22(SSH)80(HTTP),有域名再说 443

控制台点「启动实例」,选密钥对,把 .pem 下好——只给你下一次,丢了就哭去。权限收紧后再登录(以 Linux / macOS 为例,Windows 用 PowerShell 也差不多):

1
2
chmod 400 ~/Downloads/your-key.pem
ssh -i ~/Downloads/your-key.pem ubuntu@你的公网IP

第一次进去看到 Ubuntu 欢迎语,心里那句「这台机暂时是我的了」还是挺爽的。提醒自己:免费也不是无限,别乱开大盘、别挂一堆吃流量的服务,省得账单吓一跳。


二、服务器初始化:先把屋子收拾干净

登录后先更新软件源,装一堆「做人要有」的基础工具:

1
2
3
4
5
6
7
sudo apt update
sudo apt upgrade -y

sudo apt install -y \
  nginx git curl wget unzip \
  ca-certificates ufw \
  software-properties-common

时区改成中国,不然日志时间会对不上脑子:

1
2
sudo timedatectl set-timezone Asia/Shanghai
timedatectl

防火墙开起来(别把自己锁门外,先放 SSH):

1
2
3
4
5
6
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status

Nginx 装完一般就在跑了,确认一下:

1
2
sudo systemctl enable --now nginx
systemctl status nginx

浏览器先访问 http://公网IP,能看到 Nginx 欢迎页,说明 80 端口和安全组都通了。这一步过了,后面才有底气折腾博客。


三、安装 Hugo Extended 0.82.1

apt 源里的 Hugo 往往偏旧,我直接下官方包。2021 年 4 月 20 号刚出的 0.82.1,今天拿来用刚刚好:

1
2
3
4
5
6
7
cd /tmp
HUGO_VER=0.82.1

wget https://github.com/gohugoio/hugo/releases/download/v${HUGO_VER}/hugo_extended_${HUGO_VER}_Linux-64bit.deb

sudo dpkg -i hugo_extended_${HUGO_VER}_Linux-64bit.deb
hugo version

期望看到类似:

1
hugo v0.82.1+extended linux/amd64 ...

extended 字样就对了,以后主题要编译 SCSS 也不慌。


四、创建站点、装主题、写第一篇

站点放在 /var/www 下面,目录干净点:

1
2
3
4
5
6
7
sudo mkdir -p /var/www
sudo chown -R $USER:$USER /var/www
cd /var/www

hugo new site myblog
cd myblog
git init

主题我先用社区里常见的轻量主题(以 PaperMod 为例,换成你喜欢的也行):

1
git submodule add https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod

写配置文件 config.toml(0.82 时代还是 toml 居多):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
cat > config.toml << 'EOF'
baseURL = "http://你的公网IP/"
languageCode = "zh-cn"
title = "dmaxの小屋"
theme = "PaperMod"
hasCJKLanguage = true

[params]
  description = "个人博客记录"
  defaultTheme = "auto"
  ShowReadingTime = true

[[menu.main]]
  name = "首页"
  url = "/"
  weight = 10

[[menu.main]]
  name = "归档"
  url = "/archives/"
  weight = 20
EOF

创建文章:

1
hugo new posts/hello-world.md

编辑 content/posts/hello-world.md,把 draft: true 改成 false,写点内容保存。然后构建:

1
2
hugo --minify
ls public

看到一堆 index.html、css、文章目录,说明静态站已经「烤」好了。


五、把 Nginx 指到 public

丢掉默认站点,换成我们的博客根目录:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sudo tee /etc/nginx/sites-available/myblog << 'EOF'
server {
    listen 80;
    server_name _;

    root /var/www/myblog/public;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff2?)$ {
        expires 7d;
        add_header Cache-Control "public";
    }
}
EOF

sudo ln -sf /etc/nginx/sites-available/myblog /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default

sudo nginx -t
sudo systemctl reload nginx

再打开 http://公网IP,应该能看到博客首页,而不是 Nginx 默认页。这一刻——白嫖机 + 静态生成器 + 几行配置——个人站就活了。


六、以后怎么更新文章

流程固定成肌肉记忆:

1
2
3
4
5
cd /var/www/myblog
hugo new posts/又一篇.md
# 编辑 Markdown,确认 draft: false
hugo --minify
# Nginx 直接读 public,一般不用重启

想偷懒可以丢个脚本:

1
2
3
4
5
6
7
8
cat > /var/www/myblog/deploy.sh << 'EOF'
#!/bin/bash
set -e
cd /var/www/myblog
hugo --minify
echo "已发布 -> /var/www/myblog/public"
EOF
chmod +x /var/www/myblog/deploy.sh

七、有域名之后再说(今日预告)

今天先用公网 IP 顶着。等域名备案/解析好了,再改 baseURL,并可以上 Let’s Encrypt:

1
2
3
sudo apt install -y certbot python3-certbot-nginx
# 把 Nginx 的 server_name 和 Hugo 的 baseURL 改成域名后:
sudo certbot --nginx -d 你的域名.com

HTTPS 小锁亮起来,博客才算「像样」一点。那是下一篇的事。


小结

今天完成的事:

  1. 用 Amazon 免费额度开了 Ubuntu 20.04 小机器
  2. 初始化:更新、防火墙、Nginx、时区
  3. 安装 Hugo Extended 0.82.1
  4. 建站、装主题、生成 public
  5. Nginx 反代(其实是直出)静态文件,公网可访问

工具链很轻:没有 MySQL,没有 PHP,没有 Docker。免费机磁盘和内存都金贵,这种玩法刚刚好。

博客名叫 dmaxの小屋——小屋虽小,钥匙在自己手里。先写到这里,今晚值得吃顿好的。