---
url: /courses/cloud-platform-build-management/lab-04/index.md
---
# 实训 04：备份、传输与恢复 Nginx 站点

## 任务情境

课程学习站已经可以从浏览器访问。你需要为 `/var/www/html` 创建一份带时间的备份，将它安全传输到 WSL，并在不影响在线站点的前提下完成一次文件删除与恢复测试。

## 开始前

新建：

```txt
班级_学号_姓名_第04次课_站点备份恢复报告.docx
```

解压配套包，填写其中的 `site-backup-restore-report-template.docx`，并阅读课程作业与实验安全策略。

### A 路径：ECS 可用

使用第三次课的 `/var/www/html` 完成真实备份、传输和隔离恢复。

### B 路径：ECS 暂不可用

在 WSL 建立教师提供的合成 `html` 目录，完成归档、校验、删除测试文件和恢复。报告必须标明 WSL，服务器可用后补交挂载、云盘和 SCP 证据。

## 安全边界

* 不删除或覆盖在线站点 `/var/www/html`。
* 删除练习只针对 `~/cloud-course/lab-04/restore-test/html/index.html`。
* 不使用递归强制删除，不清理未知备份。
* 不开放 FTP、Samba、NFS 或其他文件传输端口。
* 不自行创建快照或 OSS 资源，避免未经确认的费用。
* 不把公网地址、私钥、密码和完整 SCP 目标放进 Word。

## 任务 1：确认存储位置与备份条件

```bash
[ECS] whoami
[ECS] hostname
[ECS] lsblk -f
[ECS] findmnt /
[ECS] df -hT /var/www/html
[ECS] du -sh /var/www/html
[ECS] find /var/www/html -maxdepth 2 -type f -print
```

写入 Word：

* 图 1：块设备、文件系统和挂载点；
* 图 2：站点目录、文件清单和占用；
* 说明站点位于哪个文件系统，以及备份为什么不能只保存在原目录旁边。

## 任务 2：创建归档和校验文件

```bash
[ECS] mkdir -p ~/cloud-course/backups ~/cloud-course/lab-04
[ECS] backup_name="nginx-site-$(date +%Y%m%d-%H%M%S).tar.gz"
[ECS] backup_path="$HOME/cloud-course/backups/$backup_name"
[ECS] tar -czf "$backup_path" -C /var/www html
[ECS] ls -lh "$backup_path"
[ECS] tar -tzf "$backup_path" | sed -n '1,30p'
```

确认归档包含 `html/index.html` 后生成校验文件：

```bash
[ECS] cd ~/cloud-course/backups
[ECS] sha256sum "$backup_name" | tee "$backup_name.sha256"
[ECS] chmod 600 "$backup_name" "$backup_name.sha256"
[ECS] sha256sum -c "$backup_name.sha256"
[ECS] printf 'backup_name=%s\n' "$backup_name"
```

写入 Word：

* 图 3：归档文件和归档目录；
* 图 4：ECS 端 SHA-256 检查；
* 解释归档列表和校验值各自证明什么。

## 任务 3：传输到 WSL

在 WSL 中填写自己的 SSH 登录目标和实际备份文件名：

```bash
[WSL] mkdir -p ~/cloud-course/lab-04-received
[WSL] cd ~/cloud-course/lab-04-received
[WSL] ECS_TARGET="登录用户名@自己的ECS公网地址"
[WSL] BACKUP_NAME="填写ECS中显示的备份文件名"
```

传输并校验：

```bash
[WSL] scp "$ECS_TARGET:cloud-course/backups/$BACKUP_NAME" .
[WSL] scp "$ECS_TARGET:cloud-course/backups/$BACKUP_NAME.sha256" .
[WSL] ls -lh
[WSL] sha256sum -c "$BACKUP_NAME.sha256"
```

写入 Word：

* 图 5：SCP 传输过程，隐藏完整目标地址；
* 图 6：WSL 端校验结果；
* 说明为什么 SCP 不需要新增 FTP 端口。

## 任务 4：完成隔离恢复测试

回到 ECS，根据实际文件名重新设置变量：

```bash
[ECS] cd ~/cloud-course/backups
[ECS] backup_name="填写本次实际备份文件名"
[ECS] backup_path="$PWD/$backup_name"
[ECS] restore_dir="$HOME/cloud-course/lab-04/restore-test"
[ECS] mkdir -p "$restore_dir"
[ECS] tar -xzf "$backup_path" -C "$restore_dir"
```

检查恢复文件：

```bash
[ECS] find "$restore_dir" -maxdepth 3 -type f -print
[ECS] diff -u /var/www/html/index.html "$restore_dir/html/index.html"
[ECS] realpath "$restore_dir/html/index.html"
```

只有 `realpath` 位于 `~/cloud-course/lab-04/restore-test` 时，才能继续删除测试副本：

```bash
[ECS] rm "$restore_dir/html/index.html"
[ECS] test ! -e "$restore_dir/html/index.html" && echo "测试文件已删除"
```

从归档恢复指定文件：

```bash
[ECS] tar -xzf "$backup_path" -C "$restore_dir" html/index.html
[ECS] test -f "$restore_dir/html/index.html" && echo "测试文件已恢复"
[ECS] diff -u /var/www/html/index.html "$restore_dir/html/index.html"
```

写入 Word：

* 图 7：删除前路径确认与测试文件删除；
* 图 8：恢复后文件存在与 `diff` 结果；
* 说明为什么这个操作没有影响在线站点。

## 任务 5：设计两级恢复方案

完成以下记录：

```txt
场景 A：只有 index.html 被误删，ECS 和云盘正常
恢复对象：
选择的备份：
恢复到哪里先验证：
验证方法：

场景 B：云盘不可用或实例无法启动
为什么同盘归档可能无效：
需要哪种独立备份：
恢复范围：
费用与停机检查：
```

快照与 OSS 只做方案设计，不要求现场创建。

## 任务 6：验收与提交

在实训包目录运行：

```bash
[ECS] bash verify.sh
```

提交前检查：

* 归档文件名带日期时间；
* 归档列表包含站点首页；
* ECS 和 WSL 的 SHA-256 均为 `OK`；
* 删除和恢复只发生在隔离目录；
* 恢复文件与在线文件比较一致；
* 两种恢复方案区分了文件级和云盘级；
* Word 截图已脱敏；
* 智慧职教显示提交成功。

最终只上传 `.docx`，不要上传备份包、校验文件、私钥或服务器配置目录。
