WordPress博客的备份和迁移

文章引用至SEOIMO

网站备份的重要性就不需要博主多说了。在Linux系统下,对WordPress进行备份其实并不难。主要涉及两部分:文件备份和数据库备份。

WordPress备份、还原/恢复以及搬家/迁移教程,可参看 WordPress备份 一文 ,以下可自行略过。

文件备份

温馨提示:以下命令中涉及的数据库和域名,请根据你VPS上具体设置,自行修改。

为了方便管理,我们先建立一个文件夹专门存放备份数据,比如 /home/backup/ :

# mkdir /home/backup

以本站所在文件夹 seoimo.com 为例,压缩整站并移动到 /home/backup/ 文件夹下(为方便管理,博主添加了备份日期):

# cd /home/wwwroot
# tar -zcf seoimo.com-20171001.tar.gz seoimo.com
# mv seoimo.com-20171001.tar.gz /home/backup/

好了,整站已经打包备份完成。接下来,开始备份数据库。

数据库备份

首先,打开 /home/backup/ 文件夹,我们需要将数据库备份在这里:

# cd /home/backup
# lnmp database list

输入 root 数据库密码(在#6 + 搭建LAMP环境设置的),即可查看当前数据库列表。

选择需要备份网站的对应数据库,以选定 sjk_seoimo 为例:

mysqldump -uroot -p sjk_seoimo > sjk_seoimo-20171001.sql

再次输入数据库密码,即可完成数据库备份。

可键入命令 # ls 查看当前目录下已经存在了备份好的文件。

此时,可以用通过 FTP 下载到本地保存,也可上传到别的 VPS 上备份保存。

WordPress迁移 / 搬家

某些情况下,我们可能需要进行网站迁移,从一个VPS搬家到另一个VPS上。如果是没有开通 SSH 功能的虚拟主机,搬家起来可能会比较麻烦,来来回回的下载和上传。但是,在VPS上操作则相对简单的多。

假设新VPS的IP为 8.8.8.8,SSH端口为 22,则打开备份目录,选择需要的文件备份和数据库备份上传:

# cd /home/backup
# ls
# scp -P 22 seoimo.com-20171001.tar.gz root@8.8.8.8:/home/backup
# scp -P 22 sjk_seoimo-20171001.sql root@8.8.8.8:/home/backup

回车后,按要求输入新的VPS登陆密码。

接下来,SSH登入新的VPS。然后解压或替换网站域名目录:

# cp /home/backup/seoimo.com-20171001.tar.gz /home/wwwroot
# cd /home/wwwroot
# tar -zxf seoimo.com-20171001.tar.gz
# rm -rf seoimo.com-20171001.tar.gz

搬家后解压的文件可能存在权限的问题,建议赋予网站根目录文件的可写权限。

# chmod -R 755 /home/wwwroot/seoimo.com
# chown -R www /home/wwwroot/seoimo.com

之后,导入数据库,仍以 sjk_seoimo 为例:

# cd /home/backup
# ls
# mysql -uroot -p sjk_seoimo < sjk_seoimo-20171001.sql

倘若虚拟主机转虚拟主机,或者虚拟主机转VPS,数据库密码和某些插件文件路径可能不同,这就需要额外去查找更改了。

但如果都是在VPS上通过LNMP搭建WordPress,通常则无需再做额外操作。

注意:如果网站开启了 HTTPS 访问,且是安装的 Let’s Encrypt 提供的免费SSL证书,那么除了上面的操作之外,还需要使用命令 # lnmp ssl add 再重新添加SSL证书。

温馨提示数据库的导出用的符号是 “>”,导入用的是 “<";注意方向,千万别搞错了。

WordPress搬家脚本(参考)

1

此脚本适用于LNMP1.4版本,并使用Certbot程序更新Let’s Encrypt证书。因此,较为复杂并且可能出错。新手的话还是按照笨方法按部就班的搬家吧!

但是,下文的搬家思路和某些命令,都是通用的,懂点基础的可以作为参考。

如果你像博主一样,厌倦了每次搬家都要一遍一遍的执行压缩、传输、解压以及添加网站等操作,尤其是当VPS上有多个域名时。那么,这里有个高(偷)效(懒)的方法。

博主写了一个自动迁移WordPress的Shell脚本(WP-Migration),在你新的VPS执行就可以。但前提是你的新旧两个VPS系统最好一致,比如同为CentOS6.x或者CentOS7.x。否则,可能出现未知的问题(博主猜测)。

优点:不需要用lnmp命令提前添加好域名和数据库,全部从旧的VPS上直接复制。

博主水平有限,Linux勉强算是入门。故而把源码贴在下面,也希望有路过的大神能提点意见和建议。

脚本源码:

#!/bin/bash
# ====================================
# Name: WP-Migration by SEOIMO
# Link: https://www.seoimo.com/wordpress-vps/
# Date: 2018-03-01
# ====================================

# 记录程序起始时间
echo[Starting time: `date +’%Y-%m-%d %H:%M:%S’`]
time_start=$(date +%s)

# 停止lnmp
lnmp stop

# 输入旧的VPS地址和端口
read -p “Please enter your Old VPS IP (e.g. 58.58.58.58): ” old_vps_ip
read -p “Please enter your Old VPS SSH Port (e.g. 58585): ” old_ssh_port

# 迁移旧的VPS上添加的[所有]网站/域名(形如:xxx.com)
echo -e “\033[32;49;1m[#1 Copy the WWWROOT files from your Old VPS now.]\033[39;49;0m”
scp -P $old_ssh_port -rC root@$old_vps_ip:/home/wwwroot/*.com /home/wwwroot/

# 更改网站权限
chmod -R 755 /home/wwwroot
chown -R www /home/wwwroot

# 迁移旧的VPS上添加的[所有]网站的数据库(先备份本机数据库)
echo -e “\033[32;49;1m[#2 Copy the DATABASE files from your Old VPS now.]\033[39;49;0m”
cp -r /usr/local/mysql/var /usr/local/mysql/var.old
scp -P $old_ssh_port -rC root@$old_vps_ip:/usr/local/mysql/var/ /usr/local/mysql/

# 更改数据库权限
chown -R mysql:mysql /usr/local/mysql/var

# 迁移旧的VPS上Apache中绑定的[所有]域名设置(先备份本机域名设置)
echo -e “\033[32;49;1m[#3 Copy the HTTPD files from your Old VPS now.]\033[39;49;0m”
cp -r /usr/local/apache/conf /usr/local/apache/conf.old
scp -P $old_ssh_port -rC root@$old_vps_ip:/usr/local/apache/conf/ /usr/local/apache/

# 旧的VPS上网站是否启用了Let’s Encrypt免费的SSL证书
echo -e “\033[32;49;1m[#4 Copy the Let’s Encrypt files from your Old VPS now.]\033[39;49;0m”
read -p “Did you set up the Let’s Encrypt SSL in your Old VPS before? (yes or no): ” letsencrypt
if [$letsencrypt” = “yes] || [$letsencrypt” = “y” ]; then
scp -P $old_ssh_port -rC root@$old_vps_ip:/etc/letsencrypt /etc/
else
echo[Skipping.]
fi

# 重启lnmp
lnmp start

# 计算程序耗时并输出
echo[End time: `date +’%Y-%m-%d %H:%M:%S’`]
time_end=$(date +%s)
echo -e “\033[32;49;1m[Successfully done! Command takes $((time_end-time_start)) seconds.]\033[39;49;0m”

# 退出
exit 0

使用方法:

在你新的VPS上依次执行以下命令:

# cd ~ && wget https://www.seoimo.com/wp-content/shells/wp-migration.sh
# chmod +x wp-migration.sh && ./wp-migration.sh

脚本执行期间需要输入3-4次旧VPS的SSH访问密码,建议提前写好。用时直接复制粘贴,免得出错。

脚本执行完成,显示如下字样,说明WordPress迁移成功。否则,本脚本可能在你的系统上无法正常使用,建议按前面的常规方法搬家。

Starting LAMP…
start apache… done
Starting MySQL SUCCESS!
[Successfully done! Command takes 105 seconds.]

2

关于SSL证书的说明

LNMP1.4使用的是Certbot程序更新 Let’s Encrypt 证书的,这种方式需要安装Python依赖,容易出错。

然而,LNMP1.5使用的是acme.sh生成证书,更加简洁高效,安全可靠。因此,本说明可能并不适用于LNMP1.5版本。

如果在旧的VPS上已经安装了免费的 Let’s Encrypt 证书,但新的VPS上从未安装过(包括为其他域名),那么搬家之后,建议在新的VPS上按照如下命令添加证书,以便安装相关依赖。

# lnmp ssl add

但是,倘若旧的VPS上已经为网站添加了证书,且新的VPS上也成功安装过 Let’s Encrypt 证书(包括为其他域名),即系统上已经安装了相关依赖。

那么,搬家之后,证书通常不会出现问题,但自动续期时可能会显示如下错误:

expected /etc/letsencrypt/live/seoimo.com/cert.pem to be a symlink
Renewal configuration file /etc/letsencrypt/renewal/seoimo.com.conf is broken. Skipping.

这是因为在复制过程中,相关软链接(类似于快捷方式)会出现问题。因此,需要重建一下 cert 相关软链接:

# cd ~ && wget https://www.seoimo.com/wp-content/shells/cert-symlink.sh
# chmod +x cert-symlink.sh && ./cert-symlink.sh

显示提示后,输入已安装 Let’s Encrypt 证书的域名即可。

脚本执行完成后,再试着手动更新下证书,看看是否可以正常续期:

# /bin/certbot renew --renew-by-default --disable-hook-validation --renew-hook "/etc/init.d/httpd restart"

如仍提示续期失败,你可能需要手动重新安装证书:# lnmp ssl add

附上 cert-symlink.sh 脚本源码如下:

#!/bin/bash
# ====================================
# Name: Cert-Symlink by SEOIMO
# Link: https://www.seoimo.com/wordpress-vps/
# Date: 2018-03-01
# ====================================

# 记录程序起始时间
echo[Starting time: `date +’%Y-%m-%d %H:%M:%S’`]
time_start=$(date +%s)

# 输入重建Symlink链接的网站/域名(形如:xxx.com)
read -p “Please enter your SSL domain (e.g. xxx.com): ” cert_domain

# 重建Symlink链接
rm -rf /etc/letsencrypt/live/$cert_domain/*.pem
ln -s /etc/letsencrypt/archive/$cert_domain/fullchain1.pem /etc/letsencrypt/live/$cert_domain/fullchain.pem
ln -s /etc/letsencrypt/archive/$cert_domain/cert1.pem /etc/letsencrypt/live/$cert_domain/cert.pem
ln -s /etc/letsencrypt/archive/$cert_domain/chain1.pem /etc/letsencrypt/live/$cert_domain/chain.pem
ln -s /etc/letsencrypt/archive/$cert_domain/privkey1.pem /etc/letsencrypt/live/$cert_domain/privkey.pem

# 计算程序耗时并输出
echo[End time: `date +’%Y-%m-%d %H:%M:%S’`]
time_end=$(date +%s)
echo -e “\033[32;49;1m[Successfully done! Command takes $((time_end-time_start)) seconds.]\033[39;49;0m”

# 退出
exit 0

备份小技巧

上文提到过,备份后的文件可以通过 FTP 软件下载到本地保存,也可以通过 SCP 命令上传到其他VPS上备份。

那么,哪个方法更好呢?

看个人喜好了。不过博主倾向于后者,即 scp 到其他VPS上备份保存。因为一旦你的网站出现问题,重新开VPS和从本地上传的话,一般只有几十到几百KB/s的上传速度,比较慢。而VPS之间的 scp 传速则快得多,通常几十MB/s的速度,简直天壤之别。

那是不是意味着需要额外单独买个VPS作为备份?

条件允许当然好。但是,也不一定需要。因为Vultr自带 “Snapshots” 快照备份功能。

博主的做法是:

在Hostwinds上另开一个机子(比如最便宜的月付$2.5),然后按本文教程搭建好本站一毛一样的站点。然后 “Snapshots”,之后把新开的VPS销毁。这样一来,即使不再新开VPS,后台依然保留备份的 “Snapshots” 。

博主需要做的就是定期花几毛钱重开VPS(每月1-2次),恢复(Restoring),然后把备份上传过来,再重新 “Snapshots” 后销毁。

这样,一旦由于某些原因本站甚至搬瓦工出了问题,博客也可以在Vultr上很快恢复访问。

Snapshots-Restoring的具体步骤:

登录Vultr → 左侧Servers → 选中VPS → 上面Snapshot → 右下Restore-Snapshot

0

Comments

发表评论

电子邮件地址不会被公开。 必填项已用*标注