本文记录了一次将WordPress站点从DigitalOcean迁移到阿里轻量云的过程,这个过程适用于所有在两台VPS间迁移站点的需求。迁移的对象包括站点程序、Web服务器配置、证书、数据库等。
需求
主要面向大陆用户的站点很悲剧地被墙了,于是购买了轻量云,测试确认各地访问速度不错后,就着手进行迁移了。
网站是WordPress程序,本来放在Digital Ocean,可能因为没有坚持站梯分离的原则,也可能20190601是无差别攻击,总之无法访问了。未来此类事件还可能再次发生,并且轻量云的访问速度确实比Digital Ocean好一些,所以索性迁移了,图个省心。
分析
轻量云的新机器是dd做了系统,啥都没有,要把之前VPS上的站点复制到新机器,站点程序和数据库原样复制是必须的;Apache的虚拟主机配置和Certbot管理的Let’s Encrypt证书最好也能原样复制过来,一来省事,二来减少错误发生的机率。这四要素备齐后,如果测试没问题,就可以更改DNS记录了。
准备
在轻量云的new_vps上添加old_vps的ssh访问权限,方便后面scp/rsync拷贝old_vps上的文件。方法是在new_vps的~/.ssh/config
添加如下配置。要确保key文件存在并且是0400
权限。
Host old_vps
Hostname old_vps_ip
Port 22
User root
IdentityFile /path/to/old_vps_key.pem
站点程序
因为我的站点程序是在本地管理,平时通过Syncthing更新到目标VPS的,所以在新VPS上配置好了Syncthing,将站点程序同步过去就OK了。需要注意的是首次同步后,要在VPS上确认、更改个别目录的权限,以确保www-data
可写。
证书
因为Certbot管理的Let’s Encrypt证书目录下有很多Symbolic Links,而scp不能保留这些软连接,所以用rsync拷贝:
rsync -avz -e ssh root@old_vps:/etc/letsencrypt /etc
这会将包括账户、证书、chain文件等全部由Certbot管理、使用的文件拷贝到new_vps上。
迁移部分证书
如果只需要将部分证书迁移到新机器,比如旧机器上有太多新机器不需要的证书,或担心旧机器的csr/key文件覆盖掉新机器上的文件时,可以只迁移部分证书目录。
在新机器上运行:
# 迁移archive目录下的特定证书
rsync -avz -e ssh root@old_vps:/etc/letsencrypt/archive/mysite.com /etc/letsencrypt/archive
# 迁移live目录下相应的特定证书软链接
rsync -avz -e ssh root@old_vps:/etc/letsencrypt/live/mysite.com /etc/letsencrypt/live
Web服务器配置
将虚拟主机的配置文件拷贝到new_vps,在new_vps上运行:
scp -r root@old_vps:/etc/apache2/sites-available/00* /etc/apache2/sites-available/
站点程序、证书、虚拟主机的配置文件都到位了,就可以启用虚拟主机了:
a2ensite 001-topvps.conf
service apache2 reload
数据库
在old_vps运行mysqldump
,导出sql文件后,在new_vps上将其导入到新数据库:
# 在old_vps运行:
# 备份topvps数据库到topvps.sql
mysqldump -u root -p --opt topvps > topvps.sql
# 在new_vps上运行:
# 拷贝old_vps上备份的sql文件到new_vps
scp root@old_vps:~/topvps.sql .
# 运行mysql,准备数据库并配置权限
mysql -uroot -p
运行的sql语句如下:
# 新建数据库
CREATE DATABASE `topvps` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
# 配置权限,要与原站点程序配置文件中的用户名/密码相同
grant all privileges on topvps.* to 'topvps'@'localhost' identified by 'my-password' with grant option;
从sql文件导入数据库:
# 在new_vps上运行
mysql -uroot -p topvps < topvps.sql
测试
在测试确认前以后的站点没问题之前,不能贸然更改DNS记录。可以将待测试的站点IP写入hosts中以便测试,类似:
46.143.28.131 www.vps123.top
访问后在new_vps上看access和error日志:
tail /var/log/apache2/topvps_access.log
tail /var/log/apache2/topvps_error.log
如果浏览器访问没有问题,access日志显示访问成功,且错误日志也没有报错,那么就可以放心更改DNS了。
更改A记录
我是用API更改的,API脚本见:用Python调用DNSPOD的API
# 更改www和@两条A记录
python dnspod.py -m update -d vps123.top -t A -n @ -v 46.143.28.131
python dnspod.py -m update -d vps123.top -t A -n www -v 46.143.28.131
# 检查确认更改成功
python dnspod.py -m update -d vps123.top -t A -n www -v 46.143.28.131
在DNSPOD更改记录后,基本是立马生效了,测试:
# ping测试,记得要删除上面的hosts文件记录
$ ping vps123.top
正在 Ping vps123.top [46.143.28.131] 具有 32 字节的数据:
来自 46.143.28.131 的回复: 字节=32 时间=44ms TTL=47
来自 46.143.28.131 的回复: 字节=32 时间=43ms TTL=47
46.143.28.131 的 Ping 统计信息:
数据包: 已发送 = 2,已接收 = 2,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 43ms,最长 = 44ms,平均 = 43ms
Control-C
至此站点迁移就完成了。
了解更多
如果迁移站点的同时需要更换域名,但在一段时期内保留旧域名的解析,就需要将旧域名301到新域名。如果有这种需求,请参考《站点更换域名怎么办》。
参考资料
-- EOF --
本文最后修改于6年前 (2019-06-08)