搭建个人技术博客时,如果直接在小内存云主机上部署带关系型数据库和动态后台的 CMS,运行一段时间后往往要耗费不少精力处理内存告警、插件更新和数据库备份迁移。
对于以技术长文、架构图解和项目记录为主的站点,更省心的做法是把 Markdown 编译、全文索引生成、站点地图构建与链接检查放在构建阶段完成;线上服务器只运行一个只读挂载的 nginx:alpine 容器分发静态文件。本文记录建站前的选型对比、服务器目录规划与固定链接约定。
建站目标与维护边界
在选型框架或购买云主机前,先明确个人技术站点的三项基础维护原则:
- 内容归档在本地 Git 仓库:所有文章正文、代码示例、项目数据与架构配图,统一使用标准 Markdown(
.md)、数据文件(.yml/.json)和矢量图形(.svg)存储在版本库中,避免绑定在特定平台的私有格式或数据库字段里,便于长期备份与迁移。 - 线上环境只读且无动态后端:线上服务器不运行 MySQL、PostgreSQL、PHP-FPM 或常驻 Node.js 进程。Markdown 编译、全文索引生成、站点地图构建与静态检查全部在构建期完成;线上仅用单个
nginx:alpine容器以只读卷(:ro)挂载静态产物,常驻内存不到25 MB。 - 版面服务于长文阅读与检索:长文页面优先保障章节目录定位、代码块复制、宽表横向滚动与架构图清晰度,减少无关的悬浮组件。
架构方案对比:动态 CMS、托管平台与静态生成(SSG)
目前常见的个人建站方案主要分为三类:第三方托管平台、传统动态内容管理系统(WordPress / Ghost / Halo)以及静态站点生成器(Astro / VitePress / Next.js Static Export)配合容器化 Nginx 托管。
下表从五个维度对比三类方案的实际运行差异:
| 评估维度 | 传统动态 CMS(WordPress / Halo) | 第三方内容平台(Notion / 托管 SaaS) | SSG 静态预编译 + Docker Nginx 只读托管 |
|---|---|---|---|
| 线上运行时依赖 | Web 服务器 + 动态语言运行时 + 关系型数据库 | 依赖外部平台接口可用性与同步速率 | 仅单个 nginx:1.27-alpine 容器 |
| 生产常驻内存 | 450 MB ~ 1.5 GB(1C1G 主机容易触发 OOM) |
无需自备主机,但自定义域名与路由受限 | 约 15 MB ~ 25 MB |
| 首屏响应延迟(TTFB) | 80 ms ~ 400 ms(受数据库查询与模板拼接影响) |
150 ms ~ 600 ms(受跨区接口渲染影响) |
5 ms ~ 18 ms(内核 sendfile 直接返回) |
| 安全暴露面 | 管理后台登录口、第三方插件漏洞、SQL 注入面 | 平台规则变动或服务调整风险 | 无数据库、无动态后台、容器挂载目录 :ro 只读 |
| 故障恢复耗时(RTO) | 需重装环境、恢复数据库快照与媒体附件 | 取决于平台自身恢复进度 | 10 秒内拉起容器并切换 releases/current 软链接 |
云服务器规格、操作系统与目录规划
采用「静态预编译 + Docker Nginx 容器托管」方案时,对服务器硬件配置的要求很低:
1. 服务器规格与操作系统选型
- CPU 与内存:
1 vCPU / 1 GB RAM或2 vCPU / 2 GB RAM即可支撑日常静态页面与图片访问,同时还有余量运行 Uptime Kuma、Umami 等轻量自托管容器。 - 磁盘容量:
20 GB~40 GBSSD 系统盘。Ubuntu 24.04 系统与 Docker 镜像约占4.5 GB,多版本静态产物与压缩日志仅占数百兆。 - 操作系统发行版:建议选择 Ubuntu 24.04 LTS(Noble Numbat)或 Debian 12(Bookworm),具备稳定的
systemd服务管理、官方 Docker 软件源以及 5 年以上的安全更新支持。
2. 生产服务器目录结构(/srv/blog)
为了避免将站点文件散落在 /root 或个人主目录中,可参照 Linux FHS 约定,在 /srv/blog(下文统称 <站点根目录>)下建立支持多版本回滚的目录树:
1 | /srv/blog/ # 生产站点根目录(<站点根目录>) |
源码编译与线上运行由此分开:生产服务器上不安装 Node.js,不存放 node_modules 或草稿文件;每次在本地或 CI 环境完成构建与检查后,只把生成的 public/ 同步到服务器的 releases/<新版本号>/,核验通过后用 ln -sfn 切换 current 软链接。
URL 路由与 Front Matter 元数据约定
在开始写文章前,建议先固定 URL 路由格式与 Front Matter 字段,避免日后迁移或改版时出现批量断链:
1. 无日期永久链接(/posts/<slug>/)
不少早期博客默认生成的 URL 带有年月日层级(如 /2026/09/01/my-post/)。后续一旦修订文章并调整了发布日期,原有链接就会变成 404。
将文章永久链接固定为 /posts/<slug>/(例如 /posts/linux-systemd-guide/)更为稳妥:
- URL 仅由英文文件名(Slug)决定,与发布日期无关;
- 构建产物统一输出为目录索引格式
public/posts/<slug>/index.html,Nginx 按标准目录索引即可直接返回,无需配置复杂的正则重写。
2. Front Matter 元数据字段
每篇 Markdown 文章顶部包含统一的 YAML Front Matter,并显式声明 draft 与 published 状态:
1 | --- |
建站与运维实施模块拆分
整套建站与服务器运维流程按底层系统、静态工程与容器网关划分为三个部分:
| 模块划分 | 核心主题与关联文章 | 涉及技术栈 | 交付结果 |
|---|---|---|---|
| Linux 与网络基础 | ・Linux 文件系统(FHS)、权限模型与 Systemd 服务管理 ・Ubuntu 24.04 初始化、SSH 双端口切换与 UFW 防火墙加固 ・DNS 解析记录、TCP BBR 拥塞控制与 ACME 证书自动续期 |
Ubuntu 24.04、POSIX 权限、systemd、OpenSSH、UFW、dig、TCP BBR、acme.sh |
完成 SSH 密钥加固、防火墙收敛、BBR 开启与 ECC HTTPS 证书自动续期的 Linux 主机 |
| 静态构建与前端实现 | ・Astro 静态构建流程、多环境配置与固定链接规范 ・CSS 色彩变量、明暗主题切换与字体排印配置 ・长文双栏响应式网格、Sticky 目录高亮与代码块交互 ・Markdown 写作规范、SVG 架构图制作与构建前自动检查 ・本地全文检索防竞态处理与 Canvas 知识图谱渲染 |
Astro 5、TypeScript、CSS Variables、WCAG AA、CSS Grid、HTML5 Canvas | 具备明暗主题切换、构建期静态检查、全文检索与知识图谱的静态站点工程 |
| Docker 与 Nginx 运维 | ・Docker 镜像分层、自定义 Bridge 网络与数据卷挂载 ・Nginx 进程模型、location 匹配优先级与缓存策略 ・Docker Compose 编排只读 Nginx 容器托管静态站点 ・Docker 容器自愈、Logrotate 日志轮转与原子发布脚本 ・Web 站点六层故障排查清单:从 DNS 到宿主机内核 |
Docker Engine、Compose v2、nginx:alpine、只读挂载、logrotate + USR1、Bash set -euo pipefail |
内存占用低于 25 MB 的只读 Nginx 容器、发布回滚脚本与故障排查清单 |
建站前基础环境核对表
在开始配置服务器与初始化代码仓库前,先确认以下四项基础环境已经就绪:
| 准备项 | 推荐配置 | 用途说明 |
|---|---|---|
| 代码版本库 | GitHub / GitLab 仓库(配置本地 .githooks/pre-commit) |
管理文章 Markdown 源码版本,拦截误提交的敏感配置 |
| 云服务器实例 | Ubuntu 24.04 LTS(1C1G 或以上,具备公网 IPv4/IPv6) | 运行 Docker Engine 与 Nginx 容器 |
| 域名与 DNS 托管 | 独立域名(托管于支持 API 续期的 DNS 服务商) | 配置 A/AAAA/CAA 记录与 acme.sh DNS-01 证书自动续期 |
| 本地终端工具 | OpenSSH 客户端、rsync、Node.js LTS 与 Git |
用于本地编译预览、静态检查与远程增量同步 |