Rocky Linux + Nginx + Hugo + Go 静态博客网站搭建
盖力维
对于一个技术爱好者而言,一个好的博客网站可以记录自己的技术思路、解决方案乃至于用作备忘录,同时可以向全世界的人展示自己,因此制作一个好的博客网站很有必要。
这篇博客记录了本网站搭建的过程,当然省略了我绕弯路做的无用功,同时保留了所有必要的步骤,详实全面。
我采用的方案如标题所示:Rocky Linux + Nginx + Hugo + Go 静态博客网站
准备阶段
租赁服务器
采用“浪浪云”平台的香港服务器,免除 ICP 备案。
我只租赁了一个月的尝试一下,后期还会再考虑要不要继续租赁,因为阿里云的便宜服务器没有香港的,而且至少需要租赁一年。
租赁域名
我在阿里云平台租赁了 220303.work 域名为期一年。
搭建阶段
操作系统
浪浪云平台自带安装 Rocky Linux 的功能,采用了 Rocky Linux 9 。
先使用浪浪云提供的线上 ssh 功能连接服务器,更改 ssh 监听端口为 22 。
1# 编辑ssh配置文件。
2vim /etc/ssh/sshd_config
找到以下内容,并将 Port 更改为 22 。
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
浪浪云默认已经建立 22 端口 ssh 协议的入站规则,无需担心。
同时,浪浪云默认建立了全部通过的入站规则,现在可以将之删除。
接下来准备系统。
1# 查看系统信息
2cat /etc/os-release
3
4#浪浪云要求的密码强度需要大小写字母,而我不想要小写,所以在这里重置了root密码。
5passwd root
6
7# 更新软件列表
8dnf check-update
9# 升级所有软件
10dnf update
11
12# 建立网站目录结构
13cd /
14mkdir server
SSH连接
Rocky Linux 自带 ssh 。
使用 powershell 连接服务器。
1# 使用powershell连接服务器。
2ssh root@220303.work
3# 需要输入浪浪云让我设置的密码
配置服务器。
在 /etc/ssh/sshd_config 配置文件中,确保以下两行如给出所示。
AuthorizedKeysFile .ssh/authorized_keys
PubkeyAuthentication yes
配置本地主机。
1# 生成新密钥对
2ssh-keygen -t ed25519 -C "server_220303.work" -f "T:\ELCO\Computer Science\Computer Network\220303's Server\SSH\id_e25519"
3
4# 检查 ssh-agent 服务状态
5Get-Service ssh-agent
6# 如果状态为 'Stopped',则启动它并设置为自动启动。
7Set-Service -Name ssh-agent -StartupType Manual
8# 开启ssh-agent服务
9Start-Service ssh-agent
10
11# 向ssh-agent添加私钥
12ssh-add "T:\ELCO\Computer Science\Computer Network\220303's Server\SSH\id_e25519"
编辑 C:\Users\Administrator\.ssh 配置文件,添加如下内容:
# 针对我的服务器(现在在浪浪云-香港)
Host server # 自定义一个简单别名
HostName 220303.work # 服务器的真实 IP 或域名
User root # 登录服务器用的用户名
IdentityFile "T:\ELCO\Computer Science\Computer Network\220303's Server\SSH\id_ed25519" # 明确指定使用为服务器创建的密钥
IdentitiesOnly yes # 重要!只使用指定的密钥,不尝试其他
ServerAliveInterval 60 # 每隔60秒发一次心跳包,维持SSH链接
ServerAliveCountMax 3 # 连续3次心跳连接失败才关闭SSH连接
上传公钥到服务器,由于 powershell 不支持 ssh-copy-id 命令,故使用 Git Bash 。
ssh-copy-id -i "T:\ELCO\Computer Science\Computer Network\220303's Server\SSH\id_ed25519.pub" root@220303.work
成功后,可以用 powershell 直接登录而无需输入密码。
1ssh server
Go
1# 安装Go
2dnf install go
Git
1# 安装git
2dnf install git
Hugo
1# 由于Hugo不在软件源里,所以我需要单独下载。
2# 注意需要下载hugo_extended版本
3wget https://github.com/gohugoio/hugo/releases/download/v0.150.0/hugo_extended_0.150.0_Linux-64bit.tar.gz
4
5# 安装hugo 到/opt/hugo (这里将来会有解压出的一个hugo文件夹和几个类似于readme的文件)
6mkdir /opt/hugo
7mv hugo_extended_0.150.0_Linux-64bit.tar.gz /opt/hugo/
8cd /opt/hugo
9tar -xvf hugo_extended_0.150.0_Linux-64bit.tar.gz
10rm hugo_extended_0.150.0_Linux-64bit.tar.gz
11
12# 建立软连接
13ln -s /opt/hugo/hugo /usr/local/bin/hugo
14
15#建立博客站点框架
16cd /server
17hugo new site blog
Hugo会在/server中生成如下目录:
1blog/
2├── archetypes/ # 新文章模板,决定新建 Markdown 文件的默认 front matter
3├── config.toml # Hugo 全局配置文件(也可以用 config.yaml 或 config.json)
4├── content/ # Markdown 文章存放目录
5├── data/ # 数据文件(可选,YAML/JSON/TOML)
6├── layouts/ # 自定义模板(覆盖主题模板)
7├── static/ # 静态资源(图片、CSS、JS)
8├── themes/ # 主题文件目录
9└── public/ # Hugo 生成的静态网页(HTML/CSS/JS)
Nginx
1# 安装Nginx
2dnf install nginx
3
4# 设置开机自启
5systemctl enable nginx
6# 启动Nginx
7systemctl start nginx
8# 查看服务状态
9systemctl status nginx
10
11# 检查主配置文件,但没什么要改的。
12vim /etc/nginx/nginx.conf
13
14# 新建虚拟网站配置 (在RHEL系列默认目录 /etc/nginx/conf.d/)
15vim /etc/nginx/conf.d/blog.conf
录入以下内容( 220303.work 为域名, root 为刚才 Hugo 建立站点的发布目录)
# HTTP 自动重定向到 HTTPS
server {
listen 80;
server_name 220303.work www.220303.work;
location / {
return 301 https://$host$request_uri;
}
}
# HTTPS 配置
server {
listen 443 ssl;
server_name 220303.work www.220303.work;
root /server/blog/public;
index index.html;
ssl_certificate /etc/letsencrypt/live/220303.work/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/220303.work/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
try_files $uri $uri/ =404;
}
# 可选:HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
继续配置 Nginx
1# 更改目录权限,使得/server属于root,但Nginx可以读和执行,采用ACL权限。
2chown root:root /server
3setfacl -R -m u:nginx:rx /server
4setfacl -R -d -m u:nginx:rx /server
5# 检查一下ACL权限
6getfacl /server
7
8# 配置文件语法测试
9nginx -t
10# 重新加载配置
11systemctl reload nginx
12# 必要时重启Nginx
13systemctl restart nginx
SSL
[!CAUTION]
注意:建立证书的域名包含了本文中尚未建立的
commento.220303.work!那是给commento的子域名!可以等到
commento搭建完毕后再进行这步!
1# 安装cerbot
2dnf install certbot
3
4# 采用 `webroot` 方式为三个域名一起建立证书,保证不停机续期
5certbot certonly --webroot -w /server/blog/public -d 220303.work -d www.220303.work -d commento.220303.work
6
7# 让 systemd 重新加载 timer 配置
8systemctl daemon-reload
9
10# 同时启用并启动 timer
11systemctl enable --now certbot-renew.timer
12
13# 检查是否正常,看第一数列有没有触发时间,触发时间是否正常。
14systemctl list-timers | grep certbot
建立连接
思路:先在服务器的 /server/blog 建立仓库作为远程仓库,将所有内容纳入提交,配置接受强制推入。然后在本地 .../server/blog 建立新仓库,与远程仓库联系起来并 pull 接受历史。之后就可以下载 ananke 主题作为子模块,同时添加想要的博客文章和图片。将本地仓库推送入远程仓库,设置钩子使得远程仓库自动递归检出子模块,生成博客网页。
服务器终端:
1git init
2git config receive.denyCurrentBranch updateInstead
3git add .
4git commit -m "All Begin... Init server-side repo..."
在 /server/blog/.git/hooks 建立脚本 post-receive ,内容如下:
1#!/bin/bash
2
3# 设置环境变量,防止交互式提示
4export GIT_DIR=/server/blog/.git
5export WORK_TREE=/server/blog
6export HUGO_PUBLIC_DIR=/server/blog/public # 根据你的Hugo输出目录调整
7
8echo "🔄 开始处理 post-receive 钩子..."
9
10# 1. 强制检出工作目录的最新文件(重要!)
11git --work-tree=$WORK_TREE --git-dir=$GIT_DIR checkout -f
12
13# 2. 更新子模块(递归初始化并拉取)
14echo "🔁 正在更新子模块..."
15git --work-tree=$WORK_TREE --git-dir=$GIT_DIR submodule update --init --recursive --force
16
17# 3. 使用 Hugo 生成静态站点
18echo "📦 正在使用 Hugo 生成静态页面..."
19cd $WORK_TREE
20# 假设hugo在系统PATH中,否则请使用绝对路径(如/usr/local/bin/hugo)
21/usr/local/bin/hugo --minify --destination "$HUGO_PUBLIC_DIR"
22
23echo "✅ 所有步骤已完成!博客已自动部署。"
24# 说明访问地址
25echo "🌐 博客可通过 http://220303.work 访问"
本地终端:
1git init
2git remote add origin server:/server/blog
3git pull origin master --allow-unrelated-histories
4git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke.git themes/ananke
将 hugo.toml 中的内容改为如下:
1baseURL = 'https://220303.work'
2languageCode = 'zh-cn'
3title = "220303's Blog Site"
4theme = 'ananke'
新建第一篇博客 Hello_World.md 和对应的封面图片。
上传到服务器并触发钩子自动更新。
1git add .
2git commit -m "The first blog post of my life."
3git push --set-upstream origin master
4# 第一次需要加参数'--set-upstream origin master'来指定对应远程分支。以后只需要简单 git push 就可以
检查网页是否正常显示。
自动化
在本地电脑创建脚本 build.ps1 ,内容如下:
1param (
2 [string]$m = "Try many new thing,don't care the commit rules." # 默认的 commit message
3)
4
5# 执行 Git 命令
6git add .
7git commit -m "$m"
8git push