WordPress 迁移

从……大概一年多以前?Offline 要涨价开始,我就说要抛弃他家 Scaleway,转到 Hetzner Cloud 上来,然而因为懒……所以就一直没弄。今天突发奇想就弄了一下。

WordPress 迁移的方法有很多,可以考虑底层的方法把网站目录、数据库和 nginx 配置文件连锅端,也可以用一些插件辅助完成这个事情。出于懒……我个人选择了插件。

在这个迁移中使用的是 All-in-One WP Migration 插件,其作者声称可以直接打包把站点导出,包含所有的文章、主题以及插件信息。为了测试该插件能否正常工作,我首先使用了另一个二级域名并安装 WordPress 作为测试平台,很顺利地完成了导入以后,就开始了主域名的迁移工作。

由于我的环境是 Oneinstack 的 LNMP 一件包,其 vhost 管理并没有提供相应的更改域名功能,在阅读了代码之后,发现其功能似乎是 stateless 的,也就是说包括 vhost 列表的查询以及 Let’s encrypt 证书管理在内都通过读取对应应用程序的配置文件完成,而非本地再对已有的域名进行配置文件的保存。这样的设计为我之后要干的事情提供了极大的方便,即手动更改本地域名地址之后,只要不变动文件夹结构,就不会影响该脚本的后续使用。

迁移这个简单的 WordPress 站点(没什么特殊配置,都在 WP 框架内完成,因此使用迁移插件即可),需要做的有这样几件事:

  • 导出原站点
  • 在新 VPS 上建立 vhost,并申请 Let’s encrypt 证书
  • 安装 WordPress
  • 导入原站点

需要注意的一点是,如果需要在 vhost 中更改域名,一定要在安装 WordPress 之前完成,因为 WordPress 似乎根据安装时保存在 MySQL 数据库中的网址自行进行 301 跳转,即使更改了 nginx 中的网址,Wordpress 仍然会在后续访问中跳转会原来的地址,进而会导致 https 证书地址不匹配的问题。

这个问题最开始是在完成了使用测试域名的导入以后,想更换为原来的主域名时发生的。在使用 acme.sh 生成证书并安装,且完成 nginx config 中的证书路径修改之后:

acme.sh --issue -d <domain> --webroot <web_root_dir>
acme-sh --install-cert -d <domain> --key-file /usr/local/nginx/conf/ssl/<domain>.key --fullchain-file /usr/local/nginx/conf/ssl/<domain>.crt --reloadcmd  "service nginx force-reload"

在访问原网址时仍然会跳转到之前使用的测试网址,这让我百思不得其解。在删除网站根目录下的所有文件,重新生成证书以及 vhost 配置文件等方法均无果之后,我使用了使用 curl -I 查看调试信息:

# curl -I https://blog.gloriousdays.pw
HTTP/2 301
server: nginx
date: Sun, 25 Aug 2019 16:36:56 GMT
content-type: text/html; charset=UTF-8
location: https://blog2.gloriousdays.pw/
x-redirect-by: WordPress
strict-transport-security: max-age=15768000

可以看到似乎是由 WordPress 完成的 301 跳转。与之相对的正常访问和 nginx 完成的 301 跳转是这样:

# curl -I https://blog.gloriousdays.pw
HTTP/2 200
server: nginx
date: Sun, 25 Aug 2019 17:46:59 GMT
content-type: text/html; charset=UTF-8
content-length: 41183
vary: Accept-Encoding
vary: Accept-Encoding, Cookie
cache-control: max-age=3, must-revalidate
last-modified: Sun, 25 Aug 2019 17:34:44 GMT
strict-transport-security: max-age=15768000

# curl -I http://blog.gloriousdays.pw
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Sun, 25 Aug 2019 17:47:03 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Location: https://blog.gloriousdays.pw/
Strict-Transport-Security: max-age=15768000

这样似乎就定位了问题所在,Wordpress 在某个地方存储了网站的地址,并且依照其进行跳转。后来想到,在进行网站测试导入时,已经完成了 WordPress 安装并连接了数据库,在之前删除网站目录文件重新放入 WordPress 安装包的时候也没有进行清除,或许那个数据库才是问题所在。于是果断进入 mysql 命令行 drop database,并重新进行安装和导入站点流程,这时候网站就已经正常工作了。

总结一下的话,就是在安装 WordPress 之后一定不要更改 nginx 对应的域名,说实话这也很奇怪,301 跳转这个功能委托给 nginx 完成就好,WP 何必多此一举呢。

发表回复

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