将 WordPress 手动迁移至 Ubuntu 16.04 + nginx + PHP 7.2 环境

我想做的事情 (Wǒ zuò de

将WordPress从共用租用服务器迁移到VPS。
选择使用VPS的原因是因为想要使用Ruby on Rails。

为了未来计划从WordPress切换到Ruby on Rails,我们计划在文档根目录下创建一个用于WordPress的子文件夹,并将原始WordPress的文件/文件夹迁移至该位置。

这次我们没有使用WordPress迁移工具或插件,而是手动迁移了数据。

环境

过渡服务器

我不知道发行版本是什么。
Linux内核的版本如下。

$ cat /proc/version
Linux version 2.6.32-673.26.1.lve1.4.20.el6.x86_64 (mockbuild@build.cloudlinux.com) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC) ) #1 SMP Tue Dec 27 17:42:53 EST 2016

通过专用控制面板获取服务器程序的版本信息。

サーバプログラムバージョンApache2.2.32PHP55.6.30MySQL55.6.35

服务器地址是198.51.100.10,用户账号为hoge。使用SSH连接的端口号为2222。
此外,WordPress的安装目录为/home/hoge/public_html/example.com。

远程服务器

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.4 LTS"
$ cat /proc/version
Linux version 4.4.0-116-generic (buildd@lgw01-amd64-021) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9) ) #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018
$ nginx -v
nginx version: nginx/1.12.2
$ php-fpm7.2 -v
PHP 7.2.3-1+ubuntu16.04.1+deb.sury.org+1 (fpm-fcgi) (built: Mar  6 2018 11:18:25)
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.3-1+ubuntu16.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using  EditLine wrapper

服务器地址为203.0.113.100,用户账号为foo。在SSH连接中使用的端口号是22(注:正式环境使用不同的端口号)。
nginx的文档根目录已经设置为/usr/share/nginx/html/,并在主目录下创建了名为www的符号链接。

在移行过程中,需要在原始服务器端进行预先的操作。

删除不必要的备份数据,停止备份插件。

使用了名为 BackWPup 的 WordPress 插件,但备份数据变得非常庞大。为了不增加数据传输量,删除了这些备份数据并暂停了插件的使用。
(由于原始服务器的cPanel定期进行备份,因此插件备份本身是不必要的)

清除缓存数据,删除缓存插件。

在移行的原始服务器上,我们使用了以下的WordPress缓存插件。

    • W3 Total Cache

 

    Autoptimize

这些插件已经停止使用,并使用以下命令删除了缓存文件夹。

$ rm -rf ~/public_html/example.com/wp-content/cache

由于001 Prime Strategy Translate Accelerator在插件文件夹下生成了缓存,因此在管理界面上删除了缓存。

修正 WordPress 安装目录中的直接书写部分。

我正在自定义一些WordPress的功能,其中有一个地方我直接写了 /home/hoge/public_html/example.com/ 和 WordPress的安装目录,所以我将其替换为ABSPATH。

移动WordPress文件/文件夹

对WordPress文件/文件夹进行归档和压缩

$ cd ~/public_html
$ tar zcvf ~/example-wp.tar.gz example.com

将经过压缩的存档文件传输到目标服务器上。

$ scp -P 2222 hoge@198.51.100.10:~/example-wp.tar.gz ~/

可以在源服务器或目标服务器进行迁移,但由于目标服务器只允许使用公钥认证,为了省去源服务器上的密钥生成和注册步骤,我选择在目标服务器上执行scp命令进行迁移。

如果想要使用SCP从原机器迁移到新机器,可以按照以下方式进行操作。

$ scp ~/example-wp.tar.gz foo@203.0.113.100:~/

解压和展开WordPress存档文件

将该文件夹展开到~/www/wordpress目录中。

$ cd ~/www
$ tar zxvf ~/example-wp.tar.gz
$ mv example.com wordpress

请修改访问权限。

$ sudo chown -R nginx:nginx wordpress
$ sudo find wordpress -type d -exec chmod 4775 {} \;
$ sudo find wordpress -type f -exec chmod 664 {} \;
$ sudo chmod 660 wordpress/wp-config.php

对于访问权限的设置,我参考了以下网站。

    WordPressのファイルのパーミッションはどうすべきなのか(WordPress the Right Way)

nginx 的配置

编辑nginx配置文件

$ sudo vi /etc/nginx/conf.d/default.conf
server {
  listen 80;
  server_name example.com;
  root /usr/share/nginx/html/wordpress;
  index index.php index.html;

  location / {
    try_files $uri $uri/ @wordpress;
  }

  location ~* /wp-config.php {
    deny all;
  }

  location ~ [^/]\.php$ {
    try_files $uri @wordpress;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }

  location @wordpress {
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/wordpress/index.php;
  }
}

我参考了以下网站来配置nginx。

    • nginxでwordpressのパーマリンクをデフォルト以外に対応する

 

    nginx fastcgi_params を include する箇所、割と皆間違ってるよね?

nginx 配置文件的测试

$ sudo service nginx configtest
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

看起来上述代码似乎是在测试/etc/nginx/nginx.conf文件,但是由于在同一文件中包含了/etc/nginx/conf.d/default.conf文件,所以也可以顺利测试修改后的文件。

重新启动nginx

$ sudo systemctl restart nginx.service

确认 Nginx 配置是否生效

只需确认无法访问wp-config.php文件。

当我通过Web浏览器访问http://203.0.113.100/wp-config.php时,显示出403 Forbidden和nginx的错误信息。

顺便提一下,在设置之前访问wp-config.php时不会显示任何内容。这是因为wp-config.php没有使用标准输出。

将WordPress数据库迁移入另一服务器

确认数据库信息

$ cat ~/public_html/example.com/wp-config.php | grep DB_
define('DB_NAME', 'example_wp');
define('DB_USER', 'example_wp');
define('DB_PASSWORD', 'p@sSw0rD');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

将迁移源数据库进行导出

使用mysqldump命令导出SQL文件。

$ mysqldump -u example_wp -p'p@sSw0rD' -r ~/example_wp.sql --single-transaction example_wp

如果你不想在屏幕上显示密码,可以使用-p进行交互式输入密码。请注意,在-p和密码之间不要加空格。

为了传送,将SQL文件进行压缩处理。

$ cd ~
$ tar zcvf db_example_wp.tar.gz example_wp.sql

将导出文件传输到目标服务器。

$ cd ~
$ scp -P 2222 hoge@198.51.100.10:~/db_example_wp.tar.gz .

创建MySQL数据库和用户并分配权限

需要在导出之前创建数据库,因为导出的SQL中不包含数据库创建命令。
同时,在这个时候还要创建一个用于WordPress访问的MySQL用户,并将数据库的访问权限授予该用户。

$ sudo mysql -u root
> create database example_wp;
> create user example_wp@localhost identified by 'p@sSw0rD';
> grant all on example_wp.* to example_wp@localhost identified by 'p@sSw0rD';
> flush privileges;
> [Ctrl+D]

导入数据库

解压缩已传输的压缩文件。

$ tar zxvf db_example_wp.tar.gz

若移行元的操作系统用户账户和移行先的操作系统用户账户不同(此处分别为hoge和foo,即不同的情况),则需要从SQL文件中删除以下行。

/*!50013 DEFINER=`hoge`@`localhost` SQL SECURITY DEFINER */

执行SQL文件,并将数据导入到目标数据库中。

$ mysql -u example_wp -p'p@sSw0rD' example_wp < example_wp.sql

我在数据库迁移中参考过的网站。

    • MySQLのデータインポート・エクスポート

 

    • mysql ユーザー作成&権限追加

 

    • MySQLのデータベースをまるっとお引越し。 (エクスポート/インポート)

 

    ダンプリストア時にAccess denied; you need (at least one of) the SUPER privilege(s) for this operation

确认机器运作

从Web浏览器访问http://203.0.113.100/进行尝试。
打开首页、单独文章、分类列表、标签列表、搜索结果等,确认显示没有问题。

尽管没有进行缓存设置,但响应非常快。不愧是VPS,不愧是Nginx。

解決問題的結果

删除在迁移时创建的中间文件。

$ rm ~/example-wp.tar.gz ~/db_example_wp.tar.gz ~/example_wp.sql
$ rm ~/example-wp.tar.gz ~/db_example_wp.tar.gz ~/example_wp.sql

请参考以下网站。

整体流程的设置是参考了以下网站。

    • nginxでwordpressを動かすには

 

    WordPressの他サーバーからの移転方法(プラグイン不使用)
广告
将在 10 秒后关闭
bannerAds