WordPress 搭建与迁移教程 – 薅羊毛必备

博主因为常年薅各种云服务商的羊毛(AWS,GCP,Aliyun),所以需要经常迁移 WordPress,但是在迁移和安装的过程中会遇到很多问题,所以本文记录一下整个搭建和迁移 WordPress 的过程。

本文以阿里云国际版 Ubuntu 18.04 + Nginx + MySQL + PHP (LEMP) 为例。

1.搭建 WordPress

1.1 更新系统与查看版本信息

先对 Ubuntu 系统进行更新:

sudo apt update 
sudo apt upgrade

可别忽视这一步的重要性,不更新可能会造成很多奇奇怪怪的问题。

现在我们可以查看一下自己系统的版本信息:

lsb_release -a

输出结果类似于:

Distributor ID: Ubuntu
Description: Ubuntu 18.04.2 LTS
Release: 18.04
Codename: bionic

然后我们就可以开始安装和配置软件了。

1.2 安装 Nginx

Nginix 读作 Engine X。

我们先进行安装:

sudo apt install nginx

安装之后,Ngnix 是默认启用的,但是很有可能你的服务商已经启用了 Apache,所以,Nginx 就有可能启动失败,我们先查看 Nginx 的运行状态:

sudo systemctl status nginx

如果正常启动,应该有如下信息:

 ● nginx.service - A high-performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-02-12 09:12:08 UTC; 11s ago
     Docs: man:nginx(8)
  Process: 17726 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 17714 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 17729 (nginx)
    Tasks: 2 (limit: 1152)
   CGroup: /system.slice/nginx.service
           ├─17729 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           └─17732 nginx: worker process

但是如果 Apache 已经先行启动,且占用了 80 端口,那么 Nginx 很可能启动失败,报出如下错误:

******* Failed to start A high performance web server*** and a reverse proxy server.****

这时我们需要先停止 Apache 2:

sudo service apache2 stop

如果有其他的程序占用 80 端口或者你需要启动 Ngnix 的端口,可以使用如下命令查询:

sudo lsof -i:80

也可以使用如下命令直接停止占用 80 端口的程序:

sudo fuser -k 80/tcp

对于该问题,具体参考:StackOverflow – Nginx: Failed to start A high performance web server and a reverse proxy server

到此我们应该安装完成 Nginx 且运行正常,下面开始安装和配置数据库。

1.3 安装和配置数据库

安装:

sudo apt install -y mariadb-server mariadb-client

安装完成后可以检查数据库的版本:

mysql -V

我们先设置数据库 root 用户的密码,先进入数据库命令行:

mysql -u root -p

然后输入:

use mysql;
update user SET PASSWORD=PASSWORD("Passw0rd!") WHERE USER='root';

注意将此处的密码修改为你的密码。注意此处的命令每一行结尾是都有英文分号“;”。

然后我们为 WordPress 单独新建一个用户和数据库,命令如下:

$ mysql -u root -p
Enter password:
 
MariaDB [mysql]> CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Query OK, 1 row affected (0.00 sec)
MariaDB [mysql]> CREATE USER wordpress@localhost IDENTIFIED BY 'password' ;  
Query OK, 0 rows affected (0.00 sec) 
 
MariaDB [mysql]> GRANT ALL ON wordpress.* TO 'wordpress'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
 
MariaDB [mysql]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
 
MariaDB [mysql]> exit

再次注意替换此处的用户名和密码为你需要的数据,并且最好记录下来。

1.4 安装 PHP

然后我们再安装 PHP 及需要的扩展组件:

sudo apt install php7.2 php7.2-cli php7.2-fpm php7.2-mysql php7.2-json php7.2-opcache php7.2-mbstring php7.2-xml php7.2-gd php7.2-curl

此处的 PHP-FPM(快速进程管理器)是安装 WordPress 的一个必要包。

安装完成后,FPM 应该会自动运行。

1.5 下载和配置 WordPress

接下来我们可以下载和配置 WordPress,首先下载和解压:

cd /var/www/html/
wget https://wordpress.org/latest.tar.gz
tar -zxvf latest.tar.gz
mv wordpress/* .
rm -rf wordpress

同时也删除 WordPress 的压缩包。

然后我们需要修改 WordPress 的文件目录权限:

cd /var/www/html/
sudo chown -R www-data:www-data wordpress
chmod -R 755 *

接下来对 WordPress 的数据库进行配置,找到 wordpress 文件夹目录下的 wp-config-sample.php,然后复制创建一个新的 wp-config.php,并使用 Vim 打开:

cd /var/www/html/
cp wp-config-sample.php wp-config.php
vi wp-config.php

找到如下的代码段:

/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );
/** MySQL database username */
define( 'DB_USER', 'wordpress' );
/** MySQL database password */
define( 'DB_PASSWORD', 'wordpress' );
/** MySQL hostname */
define( 'DB_HOST', 'localhost' );

我们将其中的值更新为我们之前配置的数据库名、用户名和密码。

我们还可以生成安全密钥,去 WordPress 的官方密钥生成网站(https://api.wordpress.org/secret-key/1.1/salt/)生成一段随机的密钥,然后粘贴到 wp-config.php 文件中。注意删掉之前的空值字符串。

1.6 配置 Nginx

我们需要修改 Nginx 的配置文件启动 PHP 及配置主页文件等:

vim /etc/nginx/sites-enabled/default

此处因为我只部署一个网站,所以偷懒修改了 default 文件,如果你有多个网站,或者想 WordPress 单独部署,建议新建一个 wordpress.conf 文件。

我们将如下的段落修改为:

            listen 80;
            root /var/www/html/;
            index index.php index.html;
            server_name SUBDOMAIN.DOMAIN.TLD;
 
	    access_log /var/log/nginx/SUBDOMAIN.access.log;
    	    error_log /var/log/nginx/SUBDOMAIN.error.log;
 
            location / {
                         try_files $uri $uri/ /index.php?$args;
            }
 
            location ~ \.php$ {
                         include snippets/fastcgi-php.conf;
                         fastcgi_pass unix:/run/php/php7.2-fpm.sock;
            }

注意此处要按照你的情况进行修改,如 server_name, root 等参数。

此处我的 try_files $uri $uri/ 设置为 /index.php?$args 而非 404,后面会谈到。

1.7 安装 WordPress

如果顺利的话,输入云服务器的公网 IP 地址,我们就可以进入安装 WordPress 的图形界面,此时可以看到选择语言的界面,选择英文或简体中文,就可以进入下一步:

https://yqintl.alicdn.com/18cda2066d929070ab2c3a25d312e80f716431de.png

然后我们就按照提示操作,应该就可以部署好了。

2. 迁移 WordPress

我使用的迁移工具是 All-in-One WP Migration,之前几次使用的时候都是没有问题的,但是最近更新之后,越来越恶心。

首先我们将之前的站点导出:Dashboard -> All-in-One WP Migration -> Export,导出的文件是以 .wpress 结尾的文件。

然后我们在新网站有两个方式导入:

方法一:

Dashboard -> All-in-One WP Migration -> Import

这种方法有个问题就是需要调整 php.ini 文件来扩大上传文件的大小限制,我的是在:

/etc/php/7.2/fpm/php.ini

根据 增加 WordPress 上传附件大小尺寸的限制 的教程,可以修改如下的值:

upload_max_filesize = 128M 
post_max_size = 128M
memory_limit 256M
max_execution_time 300
max_input_time 300

但是我即使修改了允许上传文件的大小限制,迁移工具还是会卡在 20% 左右的上传进度。我的网站一共才 50M,本来应该挺容易的,但是一直上传不成功,所以可以尝试方法二。

方法二:

Dashboard -> All-in-One WP Migration -> Backups

这就是迁移工具恶心的地方,本来我们可以通过先 SCP 或 FTP 上传到如下目录

/var/www/html/wp-content/ai1wm-backups

来使用 Backup 选项恢复网站,但是插件更新之后,这个功能变成付费的了。

好在我们可以自己安装低版本的插件,来绕过收费,具体就是先去自己下载 6.7 版本的插件,然后上传到 WordPress 安装,然后再使用 Backup 选项进行网站的恢复。

具体请参考:All-in-One WP Migration stuck in import issue solved

据我自己测试,即便使用 7.2 版本 导出,使用 6.7 版本导入也是没有问题的。如果不放心,可以使用同一个版本进行导入和导出。

3. 解决 bug – Debug

安装的过程总归不会一帆风顺,我们可能需要解决一些 bug 或者配置问题。

3.1 阿里云安全规则

我在完成之前的步骤之后,访问阿里云给的公网 IP 地址会提示超时,根据 https://blog.csdn.net/nicolelili1/article/details/103381658 的教程,我需要为 80 端口添加安全组。

具体请参考如上的教程。

3.2 Nginx Permalinks 404

在迁移完成 WordPress 之后,系统会提示需要设置两次 Permalinks。

但是在我进入 WordPress Settings – permalinks 设置且保存之后,除了主页,其他的文章和目录都变成了 404。

要解决该问题,我们需要按照 https://bobcares.com/blog/nginx-wordpress-permalinks-404-error/ 的教程进行设置,我选择的是第二种方法,也就是前面提到的:

location / {
try_files $uri $uri/ /index.php?$args;
}

参考目录: