很早就想开始写博客了,主题来回纠结了三轮,今天总算付诸行动——用 AWS 新账号的免费额度开了台小机器,一个下午就把站搭了起来。
当时的配置大致是这样:
| 项目 | 版本 |
|---|
| 云厂商 | Amazon Web Services |
| 系统 | Ubuntu 20.04 LTS |
| Hugo | v0.82.1 Extended |
| Web | Nginx |
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
|