操作指南/VPS 备份与恢复

VPS 备份与恢复:从副本到验证

备份的价值在于能从 VPS 之外取回,并恢复出预期文件。本练习打包一个静态网页和一份 Nginx 配置,传到另一台电脑,再校验恢复后的内容,全程不修改正在运行的网站。

· 更新: · 约 5 分钟阅读

本页目录

明确本次练习的范围

使用 Ubuntu 或 Linux/WSL 客户端,准备 Bash、GNU tar、sha256sum 和 OpenSSH。服务器命令在同一个服务器终端执行,客户端命令在另一台电脑的同一个终端执行。保持终端打开,让前面设置的变量继续可用。任何命令报错后先停下来。

练习只使用主目录下两个可丢弃文件,不改动 Nginx、防火墙或线上内容,解压也不使用 root。先从下面的测试文件开始;可选替换步骤仅涉及静态 HTTPS 部署教程中的两个文件。

更大网站需要另列静态资源、重定向、包含配置、DNS 记录及依赖。这个两文件例子不是整机或完整应用备份。

准备测试文件,不改动现有站点

在服务器创建私有练习目录。下面的配置只是被归档的文件,不是要启用的服务配置。

umask 077
backup_lab=$(mktemp -d "$HOME/ubuntu-vps-backup.XXXXXX")
mkdir -p "$backup_lab/payload/site" "$backup_lab/payload/nginx" "$backup_lab/export"
printf '%s\n' '<!doctype html><html lang="en"><title>Restore drill</title><h1>Recovered static page</h1></html>' > "$backup_lab/payload/site/index.html"
printf '%s\n' 'server {' '    listen 8080;' '    server_name example.test;' '    root /var/www/first-site;' '}' > "$backup_lab/payload/nginx/first-site.conf"
printf 'Practice directory: %s\n' "$backup_lab"

可选:若想改为备份教程中的真实网页和 server block,以下命令只替换练习副本。当前账号必须能读取两个来源文件。先检查配置是否含机密,收集文件期间暂停部署,使它们属于同一版本。只做测试文件练习时,跳过这段。

install -m 600 /var/www/first-site/index.html "$backup_lab/payload/site/index.html"
install -m 600 /etc/nginx/sites-available/first-site "$backup_lab/payload/nginx/first-site.conf"

这些命令只读取真实来源,不修改它们,也不会复制证书私钥或整个系统目录。实际网站如需更多文件,应明确加入文件清单和校验清单。

打包,并建立两层校验

在服务器计算选定文件的校验和,使用相对路径创建归档,再计算整个归档的校验和。此过程中不要变更待打包内容。

(
    cd "$backup_lab/payload" &&
    sha256sum site/index.html nginx/first-site.conf > SHA256SUMS
)
tar -czf "$backup_lab/export/static-site.tar.gz" -C "$backup_lab/payload" site nginx SHA256SUMS
(
    cd "$backup_lab/export" &&
    sha256sum static-site.tar.gz > static-site.tar.gz.sha256
)
tar -tzf "$backup_lab/export/static-site.tar.gz"
printf 'Server export directory: %s\n' "$backup_lab/export"

列表应包括 site/、nginx/、选定的两个文件以及 SHA256SUMS。外层校验和用于发现传输后的归档是否变化,内部清单则验证解压文件。如果攻击者可以同时替换数据和预期校验和,这两层检查都无法认证备份真伪。

把副本传到另一台电脑

在客户端电脑,将 remote_backup 设置为服务器刚输出的准确导出目录。替换示例 IP、账号和密钥文件名,使用已经验证可用的 SSH 参数。203.0.113.10 是文档地址,REPLACE 是占位符,不是 mktemp 实际生成的目录后缀。

umask 077
recovery_dir=$(mktemp -d "$HOME/ubuntu-vps-restore.XXXXXX")
remote_backup=/home/deploy/ubuntu-vps-backup.REPLACE/export
scp -i ~/.ssh/ubuntu_vps "deploy@203.0.113.10:$remote_backup/static-site.tar.gz" "$recovery_dir/"
scp -i ~/.ssh/ubuntu_vps "deploy@203.0.113.10:$remote_backup/static-site.tar.gz.sha256" "$recovery_dir/"

接受新主机前,通过可信渠道核对 SSH 主机指纹。如果复制失败源于 SSH,使用连接排查指南,不要为了传输成功就关闭主机密钥检查。

SCP 通过 SSH 保护传输,但 tar.gz 文件本身只是压缩,并未加密。保护接收账号和存储,数据有要求时使用静态加密。同一 VPS 的另一个目录不能算服务器外副本。

先验证,再恢复到新建空目录

在客户端解压前检查归档,只有 sha256sum 显示 OK 才继续。失败时调查原因或重新传输,不要覆盖预期校验和来消除错误。

(
    cd "$recovery_dir" &&
    sha256sum -c static-site.tar.gz.sha256
)
tar -tzf "$recovery_dir/static-site.tar.gz"

将可信归档解压到新建目录。keep-old-files 拒绝覆盖已有文件,no-same-owner 防止恢复归档中的原始所有权。不要把目标改为 /,也不要通过 sudo 解压。

restore_dir=$(mktemp -d "$recovery_dir/restored.XXXXXX")
tar -xzf "$recovery_dir/static-site.tar.gz" -C "$restore_dir" --keep-old-files --no-same-owner
(
    cd "$restore_dir" &&
    sha256sum -c SHA256SUMS
)
cat "$restore_dir/site/index.html"

预期 site/index.html 和 nginx/first-site.conf 都显示 OK,并能看到恢复网页的标题。这只验证文件内容,不验证生产环境所有权、ACL、服务可用性或全部网站依赖。

文件恢复成功,不代表服务已经恢复

恢复的配置仍然是尚未启用的文本文件。使用前,在独立替代服务器上检查路径、包含文件、模块、权限与证书。验证组装后的 Nginx 配置,再重新加载并从外部检查 HTTP/HTTPS。对未变化的线上服务器做语法检查,不能证明这个恢复副本可用。

此归档刻意不包含 TLS 私钥。需要安排重新签发证书,或单独保护证书备份。不要用这套 tar 方法复制正在使用的数据库文件,应采用数据库支持的一致性备份与恢复程序。

服务商快照可能帮助恢复整机,但要查清保留期限、故障域和恢复流程。仅有快照存在,不能证明导出的网站文件能在替代主机使用。

记录目标和真实恢复结果

RPO 以时间衡量可接受的数据损失,RTO 表示恢复服务的目标时长。小型静态信息站可能设定 24 小时 RPO、60 分钟 RTO;这只是业务目标示例,不是本练习测出的成绩。每日备份只有确实成功并保持可恢复,才符合预定安排。

小屏幕上可左右滚动表格,查看完整内容。

需要记录能够说明
备份时间和发布版本标识能够恢复哪一个版本
独立存储位置与保留期限副本在哪里保留、保留多久
归档与文件校验结果选定内容是否恢复完整
开始和完成时间规定恢复步骤实际耗时
缺失文件、权限或依赖服务恢复前还缺什么
替代环境的外部 HTTPS 检查网站是否真正恢复访问

认定 RTO 可实现前,应计时完整替代过程,包括取得访问、创建资源、配置、证书以及必要的 DNS 操作。快速本地解压不是故障恢复性能测试。保留几个合适的恢复点,并检查失败的备份任务。选择主机时也要比较备份保留与恢复支持。

常见问题

需要删除原网站,才能证明备份有效吗?

不需要。恢复到独立空目录并核对清单,就能验证文件副本,避免制造停机。完整服务应在另一个替代环境测试。

校验通过,是否说明全站都已备份?

只说明清单中列出的文件一致,无法发现遗漏的资源、数据库、机密或 DNS 配置。维护完整清单,并在恢复服务后验证实际功能。

先用测试文件验证副本,再按业务补齐资源清单和恢复流程。文件完整性与服务可恢复性需要分别确认。

官方参考资料

  1. 资料 1:ubuntu.com
  2. 资料 2:www.gnu.org
  3. 资料 3:www.gnu.org
  4. 资料 4:man.openbsd.org

相关教程