WordPress 博客迁移

Step 1. 备份数据库

输入命令导出数据库

mysqldump -u root -p --opt --all-databases -r backup.sql

这里 -u 指定用户名。-p 是指定密码,可以把密码跟在 -p 后面,注意不能有空格,也可以留空,之后会提示输入数据库密码。--opt 是一些选项的简写,主要是为了快速导出数据库。--all-databases 选择导出所有数据库。-r 设置导出文件名。关于 mysqldump 的具体参数设置可以看 mysqldump(1)

将导出的数据库下载到本地。

Step 2. 备份站点数据

站点数据位于 /www/wwwroot 目录下,默认目录名为 wordpress/。输入命令将目录打包

tar -czvf wordpress.tar.gz wordpress/

这里 -c 指创建一个新的归档文件。-z 指使用 gzip 进行压缩。-v 指在归档过程中详细列出正在处理的文件。-f 指定文件名。关于 tar 的具体参数设置可以看 tar(1)

将打包好的站点数据下载到本地。

Step 3. 在新服务器上安装 LNMP

这里以 Unbuntu 为例

Step 3.1 安装 Nginx

输入命令

sudo apt update
sudo apt -y install nginx

安装完毕之后输入命令查看 nginx 版本,以检查是否安装成功

nginx -v

Step 3.2 安装 MySQL

  1. 安装 MySQL
    输入命令

    sudo apt -y install mysql-server

    安装完毕之后输入命令查看 MySQL 版本,以检查是否安装成功

    mysql -V
  2. 配置 MySQL
    输入命令

    sudo mysql

    输入语句设置 root 用户密码

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'mynewpassword';

    之后输入

    exit;

    退出数据库

  3. 对 MySQL 进行安全性设置

    输入命令

    sudo mysql_secure_installation

    之后输入 root 用户的密码

    root@VM-12-15-ubuntu:/# sudo mysql_secure_installation
    
    Securing the MySQL server deployment.
    
    Enter password for user root: 

    然后是设置密码验证功能,这个功能会检查密码的强度,并只允许使用高强度的密码,输入 Y 启用

    VALIDATE PASSWORD COMPONENT can be used to test passwords
    and improve security. It checks the strength of password
    and allows the users to set only those passwords which are
    secure enough. Would you like to setup VALIDATE PASSWORD component?
    
    Press y|Y for Yes, any other key for No:

    然后是选择密码强度,这里输入 2 选择最高的密码强度

    There are three levels of password validation policy:
    
    LOW    Length >= 8
    MEDIUM Length >= 8, numeric, mixed case, and special characters
    STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file
    
    Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:

    然后会询问是否需要修改 root 用户密码,由于我们一开始设置的就是高强度密码,所以这里输入 N 不修改密码

    Estimated strength of the password: 100 
    Change the password for root ? ((Press y|Y for Yes, any other key for No) :

    然后会询问是否删除 MySQL 安装时自带的匿名用户,这里输入 Y 删除匿名用户

    By default, a MySQL installation has an anonymous user,
    allowing anyone to log into MySQL without having to have
    a user account created for them. This is intended only for
    testing, and to make the installation go a bit smoother.
    You should remove them before moving into a production
    environment.
    
    Remove anonymous users? (Press y|Y for Yes, any other key for No) :

    然后会询问是否禁用数据库远程登录,这里输入 Y 禁用远程登录,我们只需要通过 ssh 登录云服务器或者通过 phpMyAdmin 来管理数据库就可以了,不需要远程登录

    Normally, root should only be allowed to connect from
    'localhost'. This ensures that someone cannot guess at
    the root password from the network.
    
    Disallow root login remotely? (Press y|Y for Yes, any other key for No) :

    然后会询问是否删除 test 数据库,输入 Y 删除

    By default, MySQL comes with a database named 'test' that
    anyone can access. This is also intended only for testing,
    and should be removed before moving into a production
    environment.
    
    Remove test database and access to it? (Press y|Y for Yes, any other key for No) :

    接下来输入 Y 使上述配置立即生效

    Reloading the privilege tables will ensure that all changes
    made so far will take effect immediately.
    
    Reload privilege tables now? (Press y|Y for Yes, any other key for No) :

    最后登录数据库测试一下,输入命令

    sudo mysql -uroot -p

    输入密码,登录成功之后有如下输出

    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 14
    Server version: 8.0.40-0ubuntu0.24.04.1 (Ubuntu)
    
    Copyright (c) 2000, 2024, Oracle and/or its affiliates.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    输入

    exit;

    退出数据库

Step 3.3 安装 PHP

  1. 安装 PHP
    输入命令

    sudo apt -y install php-fpm

    安装完成后输入命令查看 PHP 版本,以检查是否安装成功

    php -v
  2. 修改 Nginx 配置文件以支持 PHP

    1. 编辑 Nginx 默认配置文件 /etc/nginx/sites-enabled/default
      找到 index 开头的一行,插入 index.php,如下所示:

      # Add index.php to the list if you are using PHP
      index index.php index.html index.htm index.nginx-debian.html;
    2. 找到 location ~ \.php 被注释掉的一块,修改成如下图所示:
      nginx_php_config
      注意这里 php 后面的版本号要跟安装的 php 版本号一致

    3. 保存退出

  3. 重启 Nginx 服务
    输入命令

    sudo systemctl restart nginx.service
  4. 在Nginx网站根目录中,新建 phpinfo.php文件
    从 Nginx 默认配置文件 /etc/nginx/sites-enabled/default 中得知,网站根目录位于 /var/www/html
    root_html

    phpinfo.php 文件内容为

    保存退出

  5. 访问 http://{服务器IP地址}/phpinfo.php 能看到 PHP 的安装信息就说明成功了

  6. 输入命令删除 phpinfo.php 文件

    sudo rm -rf /var/www/html/phpinfo.php

Step 3.4 安装 phpMyAdmin

  1. 安装 phpMyAdmin
    输入命令

    sudo apt install phpmyadmin
  2. 选择 Web 服务器,这里只提供 apache2 和 lighthttpd, 我们使用的是 Nginx,所以这里随便选一个
    phpmyadmin_config

  3. 询问我们是否需要使用 dbconfig-common 配置数据库,我们之前已经配置过了,所以这里选择 NO
    dbconfig

  4. 由于我们使用的 Web 服务器是 Nginx,我们需要建立一个符号链接让 Nginx 能够找到 phpMyAdmin 的目录,输入命令

    sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin
  5. 访问 http://{服务器IP地址}/phpmyadmin/,输入用户名密码就可以使用 phpMyAdmin 管理 MySQL 数据库了

  6. 为了安全起见,我们需要修改 phpMyAdmin 的默认登录地址,可以通过重命名符号链接来做到这一点,输入命令

    mv phpmyadmin newurl

    然后就只能通过 http://{服务器IP地址}/newurl/ 访问 phpMyadmin 了

Step 4. 导入数据库

输入命令

mysql -u root -p

输入密码后进入 mysql,然后输入语句导入数据库

source backup.sql;

输入

exit;

退出 mysql

Step 4. 安装 WordPress

将之前打包好的站点数据 wordpress.tar.gz 上传到新的网站根目录 /var/www/html 下并解压

tar -xzf wordpress.tar.gz 

这里 -x 指的是从归档文件中提取,-z 指的是用 gzip 对文件进行解压,对应 .gz 后缀的文件,-f 指定文件名。关于 tar 的具体参数设置可以看 tar(1)

接下来需要在 Nginx 中新建一个站点,在 /etc/nginx/sites-available 目录下新建一个配置文件 xgjuice.top,内容如下:

server {
    listen 80;
    listen [::]:80;

    server_name xgjuice.top www.xgjuice.top;
    root /var/www/html/wordpress;
    index index.php;

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

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

然后再向目录 /etc/nginx/sites-enabled 建立符号链接

ln -s /etc/nginx/sites-available/xgjuice.top /etc/nginx/sites-enabled/

然后输入

nginx -s reload

重载 nginx 配置,即可通过域名访问网站了

Step 5. 配置 https

现在的免费 SSL 证书有效期只有 90 天了,需要经常换证书,手动配置的话非常麻烦,推荐使用 httpsok 进行自动续签

首先我们编辑 nginx 配置文件 /etc/nginx/sites-available/xgjuice.top,配置 https

在原来的配置上加上以下内容:

listen  443 ssl;
server_name xgjuice.top;
rewrite ^(.*)$ https://$host$1 permanent;

ssl_certificate certs/xgjuice.top.pem;
ssl_certificate_key certs/xgjuice.top.key;

ssl_session_timeout 5m;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000";

修改后的配置文件如下:

server {
    listen 80;
    listen 443 ssl;
    listen [::]:80;

    server_name xgjuice.top www.xgjuice.top;
    root /var/www/html/wordpress;
    index index.php;

    # http 重定向
    rewrite ^(.*)$ https://$host$1 permanent;

    # 设置ssl证书文件路径
    ssl_certificate certs/xgjuice.top.pem;
    ssl_certificate_key certs/xgjuice.top.key;

    ssl_session_timeout 5m;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security "max-age=31536000";

    # 访问日志
    access_log /var/log/nginx/xgjuice.top.https.log;

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

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

然后输入

nginx -s reload

重载 nginx 配置

最后在 httpsok 上申请证书,然后复制自动配置脚本,执行即可完成 SSL 证书的部署和自动续签

自动续签

Step 6. 修改目录所有者

由于是通过 ssh 上传的 wordpress 目录,这会导致目录的所有者与运行 php 和 nginx 的用户不同,这会导致无法在 wordpress 里上传文件,会遇到 无法将上传的文件移动至 wp-content/uploads/2024/11 的错误

upload_error

/etc/nginx/nginx.conf 里可以看到,运行 nginx 的用户是 www-data

user_nginx

wordpress 的所有者却不是:

wordpress_user

所以我们需要将 wordpress 的所有者改为 www-data,运行如下命令即可解决问题

chown -R www-data /var/www/html/wordpress