一次站点迁移过程:从DigitalOcean到阿里轻量云

     0评论

本文记录了一次将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 [email protected]_vps:/etc/letsencrypt /etc

这会将包括账户、证书、chain文件等全部由Certbot管理、使用的文件拷贝到new_vps上。

迁移部分证书

如果只需要将部分证书迁移到新机器,比如旧机器上有太多新机器不需要的证书,或担心旧机器的csr/key文件覆盖掉新机器上的文件时,可以只迁移部分证书目录。

在新机器上运行:

# 迁移archive目录下的特定证书 rsync -avz -e ssh [email protected]_vps:/etc/letsencrypt/archive/mysite.com /etc/letsencrypt/archive # 迁移live目录下相应的特定证书软链接 rsync -avz -e ssh [email protected]_vps:/etc/letsencrypt/live/mysite.com /etc/letsencrypt/live

Web服务器配置

将虚拟主机的配置文件拷贝到new_vps,在new_vps上运行:

scp -r [email protected]_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 [email protected]_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 --

本文最后修改于1年前 (2019-06-08)

差评不太行一般挺好非常不错 (No Ratings Yet)
读取中...
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址