为一时的口嗨买单

为什么突然要帮群友迁移呢?因为一开始,我看到他的博客用的cn域名,已经够难崩了,没想到网站搭建用的东西更是重量级:
CentOS7+宝塔,这DEBUFF是叠满了啊,CTOS7已经EOL,宝塔就不用说了,纯毒瘤。
然后我就说要给他完全重新整一个,就有了下面的故事。

导出数据

登陆SSH,看到网站的数据都在/www/wwwroot/里面,直接scp拉下来。

scp -r root@http://218.244.156.5/www/wwwroot/ ./

当要备份数据库的时候,出问题了。
那位小学生不记得数据库的密码,也不知道密码是什么。于是只能让他在万恶的宝塔面板导出数据库。
为了确保万无一失,我还在我另一个闲置的云服务器对数据库进行了还原,确认他网站还原成功了,然后开始换系统。

更换系统。

我这次用的是一键安装脚本:
GitHub地址是:https://github.com/leitbogioro/Tools

cd /
wget https://raw.githubusercontent.com/leitbogioro/Tools/master/Linux_reinstall/InstallNET.sh
chmod +x ./InstallNET.sh
./InstallNET.sh -alpine

安装完成后,root的默认密码是:LeitboGi0ro。要马上更改,避免被他人非法登陆。
然后要降级到稳定版,因为默认安装的居然是测试版:

第一次不知道为什么,没成功,第二次就成功了,一模一样的操作。
最搞笑的是,第一次失败的时候那位小学生已经睡觉了,没办法重置服务器,第二天有碰不到电脑,于是服务器炸了一整天。
印证了群里面另一个群友看到这位小学生把服务器密码给了我后说的话:

来,我帮你删。
啊不是,我帮你备份。

再说个题外话。本来他是想和我家里云一样用AlmaLinux 8.10的,但是奇怪的是这个系统的nginx配置很奇怪,怎么都配不好。无奈换Alpine Linux了。不过也是好事,AlpineLinux非常节省资源,可以节省出大量资源用来干别的事情。

安装环境

可以参考之前的文章,安装环境。但是这次不同,我本来想给他变成SQLite作为数据库的,他原来是MySQL。但是似乎因为数据库兼容性问题没办法导入数据,于是只能安装MariaDB了。

apk add nginx openssl php82 php82-fpm php82-json php82-openssl php82-curl php82-zip php82-phar php82-intl php82-dom php82-session php82-mbstring php82-ctype php82-tokenizer php82-fileinfo mariadb mariadb-client php82-mysqli php82-pdo_mysql php82-mysqlnd
rc-update add php-fpm82 default
rc-update add nginx default
service php-fpm82 start
service nginx start
/etc/init.d/mariadb setup
rc-service mariadb start
rc-update add mariadb default

新建数据库并导入之前的数据

根据Typecho的config.inc.php文件可以知道之前设置的数据库和密码,直接创建一个并导入数据就是了。
数据库操作:

mysql -u root -p

进入数据库后,新建一个和原来名字和密码一模一样的数据库:

CREATE DATABASE xiaolin;
CREATE USER 'xiaolin'@'localhost' IDENTIFIED BY 'rx9erYFE6cP4';
GRANT ALL PRIVILEGES ON xiaolin.* TO 'xiaolin'@'localhost';
FLUSH PRIVILEGES;
EXIT;

导入之前的数据:

mysql -u xiaolin -p xiaolin < xiaolin.sql

网站还原

先生成一个自签名证书:
生成一个自签名证书在/etc/nginx/ssl/selfsigned.crt/etc/nginx/ssl/selfsigned.key

mkdir -p /etc/nginx/ssl/
openssl genpkey -algorithm RSA -out /etc/nginx/ssl/selfsigned.key -pkeyopt rsa_keygen_bits:2048
openssl req -new -x509 -key /etc/nginx/ssl/selfsigned.key -out /etc/nginx/ssl/selfsigned.crt -days 365 -subj "/"

自自签名证书用于验证配置以及后面设置通过IP访问拒绝连接。
然后我们就需要编辑nginx的配置文件了。

nano /etc/nginx/http.d/typecho.conf

配置文件如下:

# Typecho HTTP服务器块
server {
    listen 80;
    server_name xlbzi.cn;

    # 特殊处理.well-known目录,允许通过HTTP访问
    location /.well-known {
        root /data/wwwroot/typecho/.well-known;
        allow all;
    }

    # 对于所有其他请求,强制跳转到HTTPS
    return 301 https://$host$request_uri;
}

# Typecho HTTPS服务器块
server {
    listen 443 ssl;
    server_name xlbzi.cn;

    # 设置最大上传文件大小为 8M
    client_max_body_size 8M;

    # SSL证书和密钥路径
    ssl_certificate /etc/nginx/ssl/selfsigned.crt;
    ssl_certificate_key /etc/nginx/ssl/selfsigned.key;

    # SSL设置(可选但推荐用于安全)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # 网站根目录
    root /data/wwwroot/typecho;
    index index.html index.php;

    # Serve static files directly
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # PHP处理
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # Deny access to hidden files
    location ~ /\.ht {
        deny all;
    }
}

以及,default.conf要更改为拒绝连接:

nano /etc/nginx/http.d/default.conf
server {
    listen 80 default_server;
    listen 443 ssl default_server;
    #listen [::]:443 ssl default_server;

    server_name _;  # 这是一个通配符,表示任何未匹配的主机名

    ssl_certificate /etc/nginx/ssl/selfsigned.crt;
    ssl_certificate_key /etc/nginx/ssl/selfsigned.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-GCM-SHA384';

    return 444;  # 关闭连接,不发送任何响应
}

重启nginx:

rc-service nginx restart

打开网站,嗯,除了证书报错,其他都正常了。

配置acme.sh获取证书

下载acme.sh并安装:

curl https://get.acme.sh | sh

部署证书:

cd /root/
.acme.sh/acme.sh --set-default-ca --server letsencrypt
.acme.sh/acme.sh --issue -d xlbzi.cn -w /data/wwwroot/typecho/
.acme.sh/acme.sh --install-cert -d xlbzi.cn  \
--key-file       /data/certs/xlbzi.cn.key  \
--fullchain-file /data/certs/xlbzi.cn.pem   \

然后把之前的tppecho改成使用签发的证书进行TLS加密:

# Typecho HTTP服务器块
server {
    listen 80;
    server_name xlbzi.cn;

    # 特殊处理.well-known目录,允许通过HTTP访问
    location /.well-known {
        root /data/wwwroot/typecho/.well-known;
        allow all;
    }

    # 对于所有其他请求,强制跳转到HTTPS
    return 301 https://$host$request_uri;
}

# Typecho HTTPS服务器块
server {
    listen 443 ssl;
    server_name xlbzi.cn;

    # 设置最大上传文件大小为 8M
    client_max_body_size 8M;

    # SSL证书和密钥路径
    ssl_certificate /data/certs/xlbzi.cn.pem;
    ssl_certificate_key /data/certs/xlbzi.cn.key;

    # SSL设置(可选但推荐用于安全)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # 网站根目录
    root /data/wwwroot/typecho;
    index index.html index.php;

    # Serve static files directly
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # PHP处理
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # Deny access to hidden files
    location ~ /\.ht {
        deny all;
    }
}

重启nginx:

rc-service nginx restart

打开网站,嗯,这下正常了。

修复数据库

回到了最开始他给我提出的问题,友联插件没法使用。
我不知道这位小朋友之前对数据库做了那些不可告人的操作,我问他也说不清楚,我就先默认数据库是有问题的。
后面试了一下,即使是从我家的服务器把插件传过去,依然不好使。于是为怀疑应该是网站数据库有问题。
为了印证我的猜想,我在他服务器上用同样的方法搭建了一个全新的Typecho博客,然后发现友联插件是正常的。这下实锤数据库有问题了。
经过与通义千问的友好交流,得知Typecho的每一个数据表的功能是什么后,我们来做迁移。
迁移的目标数据库是新建的typecho数据库,之前的数据库是xiaolin。开始表演:
导出需要的表的数据,我们只需要博客的内容,也就是文章,评论这些,设置不能要:

mkdir /data/temp
cd /data/temp
mysqldump -u root -p xiaolin typecho_comments > comments.sql
mysqldump -u root -p xiaolin typecho_contents > contents.sql
mysqldump -u root -p xiaolin typecho_metas > metas.sql
mysqldump -u root -p xiaolin typecho_relationships > relationships.sql
mysqldump -u root -p xiaolin typecho_fields > fields.sql

然后进入数据库,清空相关的数据表:

mysql -u root -p

进入数据库命令行后:

USE typecho;
SHOW TABLES;
TRUNCATE TABLE typecho_contents;
TRUNCATE TABLE typecho_comments;
TRUNCATE TABLE typecho_metas;
TRUNCATE TABLE typecho_relationships;
TRUNCATE TABLE typecho_fields;

导入之前的数据:


mysql -u root -p typecho < fields.sql
mysql -u root -p typecho < relationships.sql
mysql -u root -p typecho < contents.sql
mysql -u root -p typecho < comments.sql
mysql -u root -p typecho < metas.sql

完事后刷新一下网站,评论,文章,全部回来了。
因为这一切实验都是在新站进行的,老站还是有问题的。不过没关系,直接让老站使用新站的数据库,新站删掉,不就行了?

cd /data/wwwroot/typecho
mv config.inc.php config.inc.php.back
cp /data/wwwroot/blog/config.inc.php ./

注意:typecho文件夹是旧网站,blog文件夹是实验网站。
然后这下老网站也正常了。收工。
下次再也不口嗨了。。。。。。