考虑到之前买的位于杭州的阿里云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.d
的mysqld.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倍,访问速度快了不少。
😂