刚接触WordPress博客/网站的时候,完全没有备份的想法。博客重建已经不是什么大事了,反正没人看,东西也不多。工作之余,遇到网络攻击、运维失误、硬件故障等意外。对安全和备份的意识越来越强,对其重要性的认识上升到一个新的水平。
WordPress备份方案和备份脚本
简要介绍了一些可行的WordPress备份方案,并给出了该网站目前使用的备份方案和脚本。只要稍加修改,备份脚本也可以应用于其他类型的网站。
WordPress备份方案
备份是复制一份或多份数据,防止发生意外时数据丢失,并通过备份尽快恢复服务。要做好WordPress备份服务,需要考虑以下几个方面:
备份位置
备份需要额外的存储空间来存储冗余数据,备份位置有几种选择:
同一服务器的不同分区。这种方法的优点是备份非常快,当网站挂有木马时可以快速恢复。缺点是如果服务器无法登录,那就没办法了。
在同一数据中心的不同服务器上。优点是避免了单服务器故障的问题,同步快;缺点是需要额外的服务器,网络出现故障时机房可能无法正常接入;
在同一区域的不同服务器上。它的优点是避免了单台机房的网络和电源故障,缺点是同步速度比同一个机房稍慢。
远程服务器。远程备份的优点是避免了某个区域可能出现的网络故障(例如施工过程中电缆断裂),可以提供最大的可用性,缺点是同步速度慢。
备份到云盘/网盘。目前云备份也很成熟,数据可以备份到网盘。
这个站点采用远程备份方案,用家里的树莓派作为备份服务器,备份空间大,可以省一笔钱。
备份数据方案
有许多备份方案:
完整磁盘备份。最简单粗暴的备份方式,也是最慢的一种,优点是恢复时无忧,拷贝就完成了。VPS商家提供的快照服务就是这样;
备份数据分区。网站的数据库和程序文件放在单独的分区,备份时拷贝这个分区就足够了。比全磁盘拷贝快,但同步数据量也大;
仅备份数据库和程序文件。备份数据量小,恢复麻烦。重新安装程序和运行环境,docker可以节省你的心思。
因为是跨WAN备份,这个站点只备份数据库和程序文件,所以传输的数据量最小,备份可以更快完成。
WordPress备份方法
具体到WordPress网站的备份,有以下几种方式:
使用WordPress备份插件。有很多知名的WordPress备份插件,比如UpdraftPlus、BackWPup、WP Time Capsule等。,支持将程序和数据备份到本地、ftp、dropbox、Google Drive等。此方法适用于虚拟主机上托管的网站;
使用备份脚本。如果您的网站运行在您自己的服务器上,您可以编写自己的脚本或使用网络上的脚本进行备份。
该站点使用自己的备份脚本进行备份。请阅读详细的脚本和功能。
WordPress备份脚本
该网站使用我自己的备份脚本进行备份。备份脚本具有以下特征:
网站程序文件采用Rsync增量备份,同步速度快。
定期归档程序文件(默认每周一次);
完整数据库备份;
自动删除过期文件。
备份服务器需要Linux或Linux运行环境,如Cygwin。
备份脚本使用方法
在备份服务器上生成RSA公钥:ssh-keygen -t rsa -b 4096,然后将公钥传输到网站服务器:SSH-copy-ID-I ~/。SSH/ID _ rsa.pubroot @网站服务器ip(已做秘密认证请跳过);
复制下面的脚本代码并将其保存到一个文件中,例如根目录中的wp-backup.sh,并根据提示将脚本中的IP和mysql数据库密码更改为您的密码。
编辑/etc/crontab文件,并根据需要定期备份。比如每小时:0 * * * rootbash/root/WP-backup.sh对于个人博客,我个人觉得一天备份一次就够了,毕竟总是一样的。
备份脚本代码
以下是备份脚本代码,请按照提示进行修改:
# 请修改这些变量的值
IP=这里填写你网站服务器ip
WEBDIR=这里填写网站程序目录,例如/data/wwwroot/zsxcool
DBPASS=这里填写Mysql数据库的root密码,如果不需要密码请填123456等任意字符
DBNAME=这里填写数据库的名称
BACKUPDIR=这里填写本地备份目录,例如/root/backup
EXPIRE_DAYS=14 #保留14天的备份,可以改成30天,200天等
# 好了,下面的内容一般无需改动
# 准备备份目录
mkdir -p ${BACKUPDIR}/db
mkdir -p ${BACKUPDIR}/tar
mkdir -p ${BACKUPDIR}/files
if [ ! -f ${BACKUPDIR}/db ]; then
echo "无法创建备份目录"
exit 1
fi
# 备份数据库
DBFILE=${DBNAME}-`date +\%Y\%m\%d\%H\%M\%S`.sql.gz
ssh root@${IP} "mysqldump -uroot -p\"${DBPASS}\" ${DBNAME} | gzip > ~/${DBFILE}"
scp root@${IP}:~/${DBFILE} ${BACKUPDIR}/db/
rm -rf root@${IP}:~/${DBFILE}
# 备份程序文件
rsync -avP --delete-after root@${IP}:${WEBDIR} ${BACKUPDIR}/files/
# 归档程序
day=`date +\%u`
if [ "$day" = "7" ]; then
tar -jcf ${BACKUPDIR}/tar/`date +\%Y\%m\%d`.tar.bz2 ${BACKUPDIR}/files
fi
# 删除过期备份
find ${BACKUPDIR}/db -mtime +${EXPIRE_DAYS} -exec rm -rf {} \;
find ${BACKUPDIR}/tar -mtime +${EXPIRE_DAYS} -exec rm -rf {} \;
脚本注意事项
IP可以是主机名或域名;
如果ssh端口不是标准的22,请在~/中配置端口。ssh/配置;
该脚本将备份文件存储在三个目录中:db:存储数据库备份;Tar:存储程序文件的归档文件,可以用tar -jxf文件名解压;文件:存储网站程序文件;
建议将网站服务器上的nginx配置文件和域名程序下载到备份目录,恢复时复制过去。