白嫖AWS服务器,从零上线博客

在 AWS 免费套餐里开了一台 EC2,从 Ubuntu 初始化到装 Hugo、配 Nginx,一步步把博客敲上线。

很早就想开始写博客了,主题来回纠结了三轮,今天总算付诸行动——用 AWS 新账号的免费额度开了台小机器,一个下午就把站搭了起来。

当时的配置大致是这样:

项目版本
云厂商Amazon Web Services
系统Ubuntu 20.04 LTS
Hugov0.82.1 Extended
WebNginx

AWS 的免费额度到底能干啥

新账号的 Free Tier,每个月给 750 小时的免费额度,正好够一台实例 24 小时连续跑满一个月,这样能连续用满 12 个月。我选的配置是:

  • 系统镜像:Ubuntu Server 20.04 LTS
  • 机型:t2.micro
  • 磁盘:默认的 8G,静态博客根本用不完
  • 安全组:只放行 22(SSH)和 80(HTTP),443 等以后有域名再说

创建实例时会让你下载密钥对,.pem 文件只给这一次机会,丢了就没地方再拿了。我把这个密钥对命名为 hugo,方便后面区分。

第一次用这东西,上来就直接 SSH,结果 Permission denied,折腾了半天才想起来要先改权限:

1
2
chmod 400 ~/Downloads/hugo.pem
ssh -i ~/Downloads/hugo.pem ubuntu@公网IP

改完再连,屏幕上跳出了 Welcome to 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

时区改成 Asia/Shanghai:

1
2
sudo timedatectl set-timezone Asia/Shanghai
timedatectl

防火墙用 ufw。执行 ufw enable 时它会提示可能中断现有 SSH 连接——不过不用担心,我是通过 AWS 控制台自带的网页终端连的,不受影响。

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

这个顺序很重要:一定要先放行 OpenSSH 再启用防火墙,不然会把自己锁在外面,到时候只能去 AWS 控制台重启实例了。

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

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

浏览器访问 http://公网IP,能看到 Nginx 欢迎页,说明安全组和防火墙都放行成功了。

Hugo 别用 apt 装的

Ubuntu 自带源里的 Hugo 版本通常偏旧,而且不带 Extended 版,主题要编译 SCSS 就没法用了。我直接从 GitHub 下载了官方发布包,当时刚好是 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 字样就说明装对了。

建站、装主题、写第一篇文章

站点放在 /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

配置文件长这样:

 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/aws-hugo-blog.md

有个坑得记一下:新建文章的 front matter 里默认是 draft: true,不改成 false 的话,hugo build 不会把它输出到 public 目录:

1
2
hugo --minify
ls public

public 目录下出现了一堆 index.html 和文章目录,说明静态站生成成功了。

把 Nginx 指到 public

先禁用默认站点,把 root 换成博客目录:

 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,页面变成了自己的博客——那一刻还是挺有成就感的。:)

以后更新文章

流程基本固定了:

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 和 server_name 改成域名,再用 certbot 拉证书:

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