2021年把博客迁移到阿里云轻量服务器上，一直使用至今。中途升级了一次配置，三年的费用分别是720、918和918。其实很贵，但因为懒，不想再折腾，老老实实交了钱。今年的服务器也快到期了，看到1900分享的99元一年的阿里云ECS，果断入手了，消费该降级还得降级。并且我发现可以99元再续一年，当然要薅到底，买了2年。与现在的费用相比，两年能省1638元。接下来就是迁移网站，包括博客和收藏夹，以及Memos不打算迁移了，需要备份数据。之前的两次迁移，都有记录，也算折腾经验丰富了。搭建mastodon实例和typecho数据库迁移——博客迁移不想折腾，却不得不折腾——博客迁移但没想到又踩坑了，主要有2个：1、服务器80/443端口没有打开我把所有程序、配置、数据都弄好了，就是访问不了，也没有Nginx报错返回，连Nginx日志都查不了。最后不得不求助阿里云客服，通过客服提供的一个检测链接，测试发现80端口未打开，心里一万只草泥马奔过。去阿里云后台打开80端口后，便能访问了，至少出现了Nignx的502页面，有Nginx报错，一切就好说了。之后装完SSL证书，网站又打不开了，折腾了老半天，才意识到https是443端口，也没有打开，我真是笨出天际。搞定端口问题后，网站能正常访问，4个多小时过去了。2、Typecho的评论邮件通知功能失效恰在此时，网友小宋留言评论了，但我没有收到邮件通知。去后台测试，报错Attempt to assign property "from" on null Error。我大概猜到是PHP版本号引起的。Nginx的配置中涉及PHP版本号，我之前遇到过因为Nginx中PHP版本号配置不对，导致网站无法访问，因此我对这个信息比较敏感。新服务器上PHP版本号是8.1，而之前的服务器PHP版本号是7.4。网站能访问但插件不能用，我猜可能是评论插件CommentToEmail未兼容PHP8。但我吧有点轴，就爱新版本，不想降级PHP，于是在网上找到其它版本的CommentToEmail，以及其它的评论通知插件，一个个试下来，都不行。一不留神，2小时又过去了。只好认怂，把PHP降级到7.4，评论功能恢复。我直接判断出的问题是对的。旧版挺好，没必要死嗑新版，想起老罗那句「又不是不能用」。服务器买了2年，至少2年不用折腾了。至于Memos备份，我使用Python脚本全部下载到Obsidian中了，脚本放在Github上了。最后附上阿里云活动页面：链接
本站搭建在香港阿里云服务器，为了少折腾，一次性买了5年。但人算不如天算，6月28日开始，本站在大陆无法访问，联系客服，回复说域名被上游网络阻断。至于为什么，没人知道。自问本站内容没啥问题，猜测可能被误伤，寄希望于7月2日能够恢复。但直到深夜，依然无法访问。没办法，只好重新购买阿里云大陆服务器，迁移网站。以前写过两篇总结：博客迁移到Typecho搭建mastodon实例和typecho数据库迁移因为使用了sqlite3数据库，不涉及MySQL迁移，以为能够很快搞定，没想到还是一堆坑。记录下填坑过程。1、将原站点目录连同sqlite3数据文件和nginx配置文件，全部迁移到新服务器旧服务器上cp /etc/nginx/sites-available/www.skyue.com /home/typecho/www.skyue.com # 把nginx配置文件也复制到站点目录 zip -r typecho.zip /home/typecho/ # 将站点文件夹压缩为zip文件 mv typecho.zip /home/typecho/usr/uploads/ # zip文件复制到可访问目录新服务器上curl https://www.skyue.com/usr/uploads/typecho.zip -o typecho.zip # 下载站点文件 apt install zip # 新服务器上没有zip软件，新安装 unzip typecho.zip # 解压站点文件夹后面的事情全部在新服务器上。2、安装nginx和phpapt install nginx apt install php3、将nginx配件文件复制到配置目录并创建软链接cp /home/typecho/www.skyue.com /etc/nginx/sites-available/www.skyue.com ln -s /etc/nginx/sites-available/www.skyue.com /etc/nginx/sites-enable/www.skyue.com 4、重新加载nginx配件文件nginx -s reload这里开始报错了，提示找不到证书文件。5、安装证书按照《搭建mastodon实例和typecho数据库迁移》中记录的方式安装证书：sudo snap install core; sudo snap refresh core #如果没有snap则 apt insall snapd 安装 sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot sudo certbot --nginx -d 你的域名最后一步一直报错，提示内容也是找不到证书文件。这里卡壳了很久，最后发现，需要删除配件文件中带有# managed by Certbot注释的内容。删除后，重新执行sudo certbot --nginx完成证书安装。再执行nginx -s reload重新加载配置文件，也没有报错。于是激动的到浏览器中访问网站，又来了个502 bad gateway错误。6、nginx配件文件中修改php版本继续Google，502的错误一般是fastcgi导致的，nginx配件文件中刚好有一段fastcgi配置，其版本号是7.2，但新安装的php是7.4，于是修改版本号解决。7、安装php-sqlite3再访问网站，浏览器继续报错，这次是PHP错误，大意是无法操作sqlite3数据库。需要安装php-sqlite3插件解决。apt install php-sqlite38、修改目录和文件权限继续访问网站，PHP继续报错，提示sqlite数据文件只有读权限，没有写权限。需要修改目录和数据库文件权限：sudo chown -R :www-data /home/typecho/ # 修改站点目录权限 sudo chmod -R 775 /home/mydata.db # 修改数据库文件权限9、解决Python脚本发布报错当我使用《使用Python和MetaWeblog API发博客》文中的脚本发布本文时，终端报错ResponseError，就这么一点内容，查都没法查。于是使用MWeb进行发布，MWeb提供了更详细的错误信息，原来服务端没有php-xml插件，导致博客的xmlrpc接口无法工作。安装php-xml插件解决。apt install php-xml到这里，才终于全部解决。香港服务器可以申请退款了。最后吐个槽，阿里云比腾讯云贵，但考虑到之前域名已经在阿里云备案，贵就贵点，不折腾了。也希望这篇文章以后用不上。
周末折腾了两天服务器，干了两件事：1、搭建Mastodon实例，个人账号@skyue@m.skyue.com欢迎关注。2、博客从AWS迁移到阿里云香港，同时将Typecho数据库从MySQL迁移到SQLite3。源起去年买AWS的Lightsail搭建Typecho的原因之一是官网说只要3.5刀/月（单核/512M内存/20G SSD），但实际用起来发现平均要7刀/月，显然我被坑了。但是吧，7刀也并非不能接受，考虑到迁移的麻烦，便一直将就用着。9月AWS的Lightsail账单最近想搭建Mastodon实例，买了阿里云香港轻量级服务器，单核2G内存50G SSD，比AWS配置高多了，却只要34元/月，于是趁机把博客也迁移了。搭建mastodon实例教程：《如何利用Docker搭建Mastodon实例（一）：基础搭建篇》我完全按照上面文章一步步配置的，只有两个小错误已经反馈给原作者修改。特别留意「安装并配置Nginx」那一节，有如下一段：sudo snap install core; sudo snap refresh core #如果没有snap则 apt insall snapd 安装 sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot sudo certbot --nginx -d 你的域名这段应该是安装SSL证书，支持https访问。我在下文的Typecho迁移时，也复用了这段命令，给博客添加SSL证书。比我以前申请、下载证书、上传证书，再配置方便多了。Typecho博客迁移MySQL迁移方案最开始，我只打算迁移服务器的同时，把Apache改为Nginx，因为Mastodon使用了Nginx，复用比较方便。所以，我做了两件事：1、将旧服务器Apapche站点主目录文件打包，迁移到新服务器的网站目录，再配置Nginx指向该目录。2、将MySQL导出，再导入到新服务器MySQL，MySQL导出和导入参考《Typecho博客迁移 》，新服务器的MySQL安装，参考《Ubuntu18.04 安装MySQL》服务器之间的文件迁移有个小技巧：如果旧服务器博客还没有关停，可以将文件放在旧服务器的站点根目录，然后到新服务器用wget命令获取。站点文件和数据库均完成迁移，Nginx也配置好了，我以为一切就绪，但访问时却发生数据库连接错误，查了一些资源，发现是MySQL数据库root账户的权限问题。参考《解决 MySQL 的 ERROR 1698 (28000): Access denied for user 'root'@'localhost'》得到解决。这句「得到解决」写起来容易，其实我把MySQL卸载重装了N次才搞定，每次按网上修改root权限后，就不能再使用root密码登录MySQL了，到最后仍然如此，只是我突然发现可以不用密码登录MySQL，然后把站点下config.ini.php中的密码设为空，成功访问博客数据。经此一役，让我觉得MySQL迁移太麻烦了，所以决定改用SQLite，SQLite是个文件，迁移只需要复制文件即可。MySQL迁移到SQLite3我的博客日访问UV很少超过50，SQLite数据库足够了。首先，需要将MySQL数据转为SQLite数据文件，在网上找到一个Python库mysql-to-sqlite3可以解决。安装后，执行下面的命令将博客数据库导出为SQLite的DB数据文件。mysql2sqlite -f blog.db -d blog -u root # -f: 导出的SQLite文件名 （必须） # -d: 需要导出的MySQL数据库，我的是blog，Typecho默认一般是typecho （必须） # -u: MySQL用户名 （必须） # -p: MySQL密码 （若有）然后修改config.ini.php，将下面这段/** 定义数据库参数 */ $db = new Typecho_Db('Pdo_Mysql', 'blog_'); $db->addServer(array ( 'host' => 'localhost', 'user' => 'root', 'password' => '', 'charset' => 'utf8', 'port' => '3306', 'database' => 'blog', ), Typecho_Db::READ | Typecho_Db::WRITE); Typecho_Db::set($db);修改为：/** 定义数据库参数 */ $db = new Typecho_Db('Pdo_SQLite', 'blog_'); $db->addServer(array ( 'file' => 'SQLite数据库文件绝对地址', ), Typecho_Db::READ | Typecho_Db::WRITE); Typecho_Db::set($db);修改完成后，再访问博客，发现还是有权限问题：SQLSTATE[HY000]: General error: 8 attempt to write a readonly database这时只是文件权限，改起来比较简单，参考《Typecho博客搬家后遗症》，执行：# 将 * 换成SQLite数据文件所在的目录绝对路径 chown -R :www-data * chmod -R 775 *再访问，就能打开网站了。你现在看到的本博客，就是Typecho + SQLite的方案。