这是一篇具有实际操作价值的文章,详细介绍了自动备份网站数据和配置文件的步骤。以一台安装了Ubuntu操作系统的云服务器为例,使用tar、rsync和cron工具,备份脚本每天执行一次,保留最近一年的数据。备份策略方面,我们采用了3-2-1备份原则,数据有三个副本。除了一个工作副本之外,还有一个存储在本地不同介质,一个异地备份。举个例子,你有一张照片,它存储在你家的电脑里,这是第一个本地副本。这张照片还存储在一块移动硬盘上,这是第二个本地副本。你在云盘也存储了一份,这就是第三个副本。
1、准备工作
在创建备份之前,请确保云服务器有足够的磁盘空间。可通过以下命令查看总磁盘空间、网站数据大小、配置文件大小。网站数据和配置文件的目录可根据实际情况调整。
$ df -h
$ du -sh /var/www
$ du -sh /etc/apache2
当确认有足够的磁盘空间用于备份时,就可以创建存放备份文件的目录了。
$ sudo mkdir /var/web_backup
2、执行备份
用tar工具创建网站数据和配置文件的备份,备份名假设为web-server.tar.gz。
$ sudo tar -cvzpf /var/web_backup/web-server.tar.gz -C /var/ www -C /etc/ apache2
以上命令涉及到的选项参数解释如下:
- c:创建压缩包
- v:输出详细信息
- z:使用gzip压缩
- p:保留文件权限
- f:压缩包的路径和文件名
- C:更改目录
需要注意/var/和/etc/后面的空格。如果还有其他目录需要备份的,在-C选项后面加上这些目录。
要从压缩包中排除某些文件,使用--exclude=path/to/file/选项。例如要排除/var/www/example.com/junk/目录,使用以下命令。
$ sudo tar -cvpzf /var/web_backup/web-server.tar.gz --exclude=www/example.com/junk -C /var/ www -C /etc/ apache2
注意:在排除文件时,要使用相对路径而不是绝对路径。以上例子中使用的是www/example.com/junk,而不是/var/www/example.com/junk。如果有多个文件需要排除,就使用多个--exclude选项。也可以把需要排除的文件列表放到一个排除文件中。
3、测试恢复
在自动化整个备份恢复流程之前,应确保可以恢复成功。我们先创建一个用于恢复的目录,然后执行解压命令。
$ sudo mkdir /var/web_backup/restored/
$ sudo tar -xvzpf /var/web_backup/web-server.tar.gz -C /var/web_backup/restored/
以上命令涉及到的选项参数解释如下:
- x:提取文件
- z:解压文件
然后验证恢复后的文件内容,如果没有问题,删除恢复目录。
$ ls -lh /var/web_backup/restored/
$ sudo rm -r /var/web_backup/restored/
4、自动化流程
cron工具可以在指定的时间执行命令行。在这个例子中,我们在凌晨2点钟执行备份,保留最近一周的备份,并且使用日期对备份文件进行命名。
$ sudo tar -cvpzf /var/web_backup/web-server.`date +\%a`.tar.gz -C /var/ www -C /etc/ apache2
以上命令中,+\%a参数代表星期的简称,比如Mon(周一)、Tue(周二)等。tar命令会覆盖上周同一天的备份文件。
cron自动任务存储在名为crontab的文件中。一个典型的自动任务以5个数值或星号开头,然后是一行命令。数值代表执行自动任务的时间,星号代表全部时间。这5个数值分别代表分钟(0-59)、小时(0-23)、日期(1-31)、月份(1-12)、星期(0-7)。
要编辑crontab文件,执行以下命令。
$ sudo crontab -e
在文件末尾增加以下自动任务。该任务代表每天凌晨2点执行一次。
0 2 * * * sudo tar -cvpzf /var/web_backup/web-server.`date +\%a`.tar.gz -C /var/ www -C /etc/ apache2
要改成每月备份一次,使用另一个+\%b参数代表月份的简称。以下任务代表每月1号凌晨0点执行,保留最近一年的备份。
0 0 1 * * sudo tar -cvpzf /var/web_backup/web-server.`date +\%b`.tar.gz -C /var/ www -C /etc/ apache2
5、异地备份
为了完成3-2-1备份原则中的异地备份,我们要用rsync工具从Web服务器中下载备份。请确保Web服务器和备份服务器都安装了rsync。Ubuntu操作系统默认不安装rsync,在备份服务器中执行以下命令进行安装,并创建备份目录。
$ sudo apt install rsync
$ mkdir server_backup
执行以下rsync命令,下载Web服务器的网站数据到备份服务器中。
$ rsync -azP --delete username@remotehost:/var/webbackup/ /path/to/offsite/server_backup
以上命令涉及到的选项参数解释如下:
- a:压缩全部文件,同时保留超级链接和文件权限等。
- z:在传输过程中压缩文件
- P:--partial和--progress的合并,传输中断时保留部分文件,并且显示传输的过程。
- --delete:从备份目录中删除无关文件。谨慎使用该选项,可先用--dry-run选项进行测试,避免数据丢失。
要从rsync中排除某些文件,使用--exclude=relative/path/to/file/选项。例如要排除周三的备份,使用以下命令。
$ rsync -azP --delete --exclude=web-server.Wed.tar.gz username@remote_host:/var/web_backup/ /path/to/offsite/server_backup
注意:在排除文件时,要使用相对路径而不是绝对路径。以上例子中使用的是web-server.Wed.tar.gz,而不是/var/web_backup/web-server.Wed.tar.gz。如果有多个文件需要排除,就使用多个--exclude选项。
6、rsync免密码登录
我们的目标是自动化全部流程,因此需要设置rsync免密码从备份服务器登录到Web服务器。
在备份服务器上创建rsync的密钥对:
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/your_home/.ssh/id_rsa):
然后把公钥复制到Web服务器中,这样备份服务器就可以无需密码从Web服务器中下载文件了。
$ ssh-copy-id -i ~/.ssh/id_rsa_rsync username@remote_host
在备份服务器上执行以下命令,测试rsync免密码登录。
$ rsync -azP --delete -e 'ssh -i ~/.ssh/id_rsa_rsync' username@remote_host:/var/web_backup/ /path/to/offsite/server_backup
7、自动化全部流程
在备份服务器上编辑crontab:
$ sudo crontab -e
在文件末尾增加以下自动任务。该任务代表每天凌晨3点执行一次。
0 3 * * * rsync -azP --delete -e 'ssh -i ~/.ssh/id_rsa_rsync' username@remote_host:/var/web_backup/ /path/to/offsite/server_backup
综上,我们已经根据3-2-1备份原则完成了在Ubuntu云服务器上自动备份网站的过程。网站数据每天备份一次,包括本地备份和异地备份,备份数据保留一年。