将 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
通过专用控制面板获取服务器程序的版本信息。
服务器地址是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の他サーバーからの移転方法(プラグイン不使用)