博客迁移踩坑计

之前服务器到期了,需要换台服务器。不过迁移数据是个巨麻烦的事情,博客用的Typecho,这次避免环境互相影响,准备全部用docker配置。

备份

这部分没啥说的,MySQL导出sql文件;网站文件直接打包复制整个目录下的文件。

NMP

# NGINX
docker run --name nginx -p 80:80 -p 443:443 -v <配置文件挂载自行设置> -d nginx 
# MySQL
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=<数据库root用户密码> mysql
# PHP
docker run -d --name typecho-php -p 9000:9000 -v <宿主机路径>:/var/www/html php:7.2.8-fpm

NGINX里转发到PHP的配置文件大致如此

server {
    listen 80;
    server_name www.domain.com;
 
    root /var/www/html;  # 网站文件的路径
 
    location / {
        index index.php index.html index.htm;
    }
     
    if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php$1 last;
    }
 
    location ~ \.php(\/.*)*$ {
        fastcgi_pass   172.17.0.1:9000;  # php容器运行的端口
        set $path_info "";
        set $real_script_name $fastcgi_script_name;
        if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
            set $real_script_name $1;
            set $path_info $2;
        }
        fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
        fastcgi_param SCRIPT_NAME $real_script_name;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_index  index.php;
        include        fastcgi_params;
    }
}

PHP message: Adapter Typecho_Db_Adapter_Mysql is not available

这种情况是PHP找不到数据库适配器MysqlPHP 7 以后的版本已经去除了 Mysql 扩展,推荐使用 PDO
PHP官方的docker镜像中不包含pdo插件,需要我们自己安装,

docker exec -it typecho-php /bin/bash   # 进入php容器
docker-php-ext-install pdo pdo_mysql    # 安装插件
sudo docker restart typecho-php         # 退出容器,重启容器

安装完插件后,我们修改Typecho的配置文件 config.inc.php 文件中定义 Typecho_Db 的地方,

$db = new Typecho_Db('Mysql', 'typecho_');

Mysql 改为 Pdo_Mysql

$db = new Typecho_Db('Pdo_Mysql', 'typecho_');

再次重启容器使配置生效

PHP message: SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

这个是真的大坑,使用PHP连接MySQL 8的时候,发生这种错误,是由于MySQL 8默认使用了新的密码验证插件caching_sha2_password,而之前的PHP版本中所带的mysqlnd无法支持这种验证。解决这个问题,有两种办法。

此段严重抄袭,详细错误解释及解决方案参见 SHA2密码验证引起的PHP错误

第一种:PHP版本更换到 7.1.207.1.217.1.227.2.87.2.97.2.10这六个版本中的任意一种;

第二种: 如果不能升级PHP,可以在MySQL 8中创建(或修改)使用caching_sha2_password插件的账户,使之使用mysql_native_password,这样先前版本的PHP就可以连接使用了。

CREATE USER时,使用IDENTIFIED WITH xxx_plugin BY 'password',比如:

CREATE USER 'native'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password!2#4';

使用ALTER USER修改已有账户的验证插件:

ALTER USER 'native'@'localhost' IDENTIFIED WITH mysql_native_password;

ALTER USER 'native'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password';

采用前一种方式,账户的密码将被清除;BY子句将为账户设置新的密码。

/etc/my.cnf配置文件中,有一行:

# default-authentication-plugin=mysql_native_password

请删除注释符号“#”并重新启动mysqld使之生效,此后创建的账户均默认使用mysql_native_password

如果您完成MySQL Server的安装之后,在没有启动过mysqld服务的情况下修改/etc/my.cnf配置,那么启动mysqld之后创建的'root'@'localhost'账户也是使用mysql_native_password插件的。

参考自:

添加新评论