考虑到之前买的位于杭州的阿里云ECS即将在明年九月到期,于是在双十一活动期间购买了腾讯云北京的轻量应用服务器,随着各类前期准备工作与基础设施配置的完成,服务器迁移工作也随之启动。按照先易后难的顺序,决定先把这个typecho给搬过去。

新服务器的准备

由于之前在处理各种基础配置时已经安排好php了,所以就从安装MySQL开始

sudo apt install mysql-server
sudo apt install php-mysql php-json php-curl php-mbstring

安装好mysql本体和与php有关的组件,然后调整一下位于/etc/mysql/mysql.conf.dmysqld.cnf配置文件,使得一些基础设置如监听端口、地址等与原服务器一致。

同时考虑到这个blog好几天才会有一两个访问,mysql的默认高并发配置可能会造成资源浪费,于是进行了一些小调整以减少MySQL对内存的占用。

在配置文件添加

table_open_cache=150
table_definition_cache=70
performance_schema_max_table_instances=400
performance_schema=off

其中performance_schema=off关闭MySQL对性能的监视,在这四条中起决定性作用。

搞好MySQL之后,前期准备已经做好了。

迁移数据库数据

这一步是数据在两个服务器之间的转移,首先切换到root用户下避免权限问题,然后将整个数据库(包括所有的数据库结构以及用户信息)导出为sql语句文件。

mysqldump -uroot -p --all-databases > db.sql

然后再将导出的数据库文件转移到新服务器上,转移完成之后导入新的服务器。

mysql < db.sql

(看来一下数据库文件大小仅有2.8MB,但mysql运行起来却占用了200+MB的内存……)

迁移typecho文件与nginx配置

考虑到php程序的特性,迁移时可以直接把程序目录给转移过去,这里就直接用rsync了……

rsync -azvP ali:/var/www/blog /var/www/blog

然后就是nginx配置了,基本上把原样搬过来就好了,当然一些涉及ssl证书等配置还是要改成新服务器上的

server {
        #listen          80;
    listen 443 ssl http2;
    #add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
        server_name     dogcraft.top;
        root            /var/www/blog/;
        index           index.html index.htm index.php;
        ssl_certificate     /root/key/dog.pem;
    ssl_certificate_key /root/key/dog.key;

    ssl_certificate     /root/key/dogecc.pem;
    ssl_certificate_key /root/key/dogecc.key;

        location = /start-page.html {
            rewrite  ^(.*)$ /about/ permanent;
        } 

        location = /all.html {
            rewrite  ^(.*)$ /all/ permanent;
        }

        location = /BI4PID.html {
            rewrite  ^(.*)$ /BI4PID/ permanent;
        }
        
        location / {
            if (!-e $request_filename) {
            rewrite ^(.*)$ /index.php$1 last;
        }
        }
        location /usr/themes/VOID/assets/libs/mathjax/2.7.4/ {
            rewrite ^/usr/themes/VOID/assets/libs/mathjax/2.7.4/(.*) https://upyun.dogcraft.top/js/js/$1 permanent;

        }

        location /fm.html {
            root /var/www/maind/talk/;

        }
        location ~ .*\.php(\/.*)*$ {
            #include fastcgi.conf;
            #fastcgi_pass  127.0.0.1:9000;
    root           /var/www/blog/;
        fastcgi_pass   unix:/run/php/php-fpm.sock;
        #fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        #include        fastcgi_params;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
        }
        access_log /var/log/nginx/access.log vcombined;
        access_log /var/log/nginx/dogcraft.log main;
    }

配置完成之后用nginx -t检查一下,没有问题就nginx -s reload重载配置文件。

后续问题

nginx配置好之后,先在本地以改hosts的形式访问一下看是否工作正常,结果返回500错误。

遇到错误之后到/var/log/nginx/error.log看了一下,发现是 "PHP message: SQLSTATE[HY000] [1045] Access denied for user 'dog'@'localhost' (using password: YES)" while reading response header from upstream, client: xx.xxx.xxx.x, server: dogcraft.top, request: "

可能是mysql用户登录失败了,然后用mysql -u dog -p用原来的密码试了一下,结果并没有成功,于是考虑是迁移数据库的时候用户密码并没有跟着迁移过来,于是应该重置一下密码

mysql -u root -p 
mysql> use mysql;
mysql> ALTER USER 'dog'@'%' IDENTIFIED BY 'dogdogdog';
mysql> flush privileges;

其中'dog'@'%'应该与原数据库中的用户名称与host保持一致。

改完之后用mysql -u dog -p尝试登录,确认可以登录之后修改typecho根目录下的配置文件config.inc.php将密码换成新的即可。

总的来说,迁移过程并不复杂,实际上最大的问题是由于搞这个typecho太久了,一些技术细节都忘了……新服务器的最大公网带宽是原来的8倍,访问速度快了不少。