Wordpress

将博客迁移到用 Hugo 驱动

过去这些年一直用 WordPress 做博客的后端,其实也没什么不好的,任何一个浏览器打开就能写和管理,虽然后端重了点,但一次配置好也不用怎么折腾,现在的 VPS 跑个 PHP 和 MySQL 还是够的

前两年考虑要不要彻底使用 Markdown 来做内容管理,同时把整站变成不用那么多依赖的情况,比如挂 GitHub Pages 上用 Jekyll 直接生成。后面找了下发现 Hugo 这个基于 go-lang 的本地生成服务,当时还尝试看看要不要迁移,不过文档写得总是容易,对我这个历经二十多年,里面糅合了好多历史平台的内容,跑完第一步后就懒得将其往前推进到一个明确可用状态

今年各种 AI 能力突飞猛进到真的可以干活了,于是找 Codex,在 GPT 5.6 Sol 的帮助下,先确认是可以迁移的,需要备份保留哪些数据,怎么转移和验证,并逐步算完成了迁移和整理吧

既有数据迁移倒是还快的,毕竟想要啥我都能给出来,不管是 WordPress 所在目录和之前各种静态文件所在的 wp-content,还是 MySQL 数据库表,或者是 WordPress 导出的 wxr,还包括用作评论的 Disqus 的所有导出数据

接下来的验证整合,确实验证了各种历史沉淀,光是博文,就从最早的教育网博客,到 Live Space、百度空间、QQ 空间、人人网、Blogspot、自建 WordPress 等等

评论早年很多平台的应该都被丢失了,最早接的第三方评论系统应该是多说,这个没了后应该一直用的 Disqus,在整理过程中还把 Disqus 历史迁移没匹配上的好些内容也给匹配上了,AI 真强大

再就是把历史的外链图片都想办法补到本地,包括之前用新浪微博当图床的,还好现在微博还在把相册下载到本地能匹配上,还有用人人当图床的,从我几年前备份的人人网数据里匹配到一些,但也有之前备份就有遗漏的找不到,还好从我自己的照片库,再把当年发文时配的原图人肉找到,在 Live Space 阶段的图,通过 OneDrive 的日志图片找到绝大部分,很诡异的有一张图不在这个目录,还好通过 OneDrive 按日期的照片墙,最终也找到了那张,在 Google Photo 的图现在还能访问,AI 就直接帮忙下载备份到本地了,有两张曾经传在教育网博客的无关紧要的示意图,找不到就算了,还有之前用 163 相册的图,就从自己的照片库里去匹配上,最终还有曾经在水木的一张图也不可能找到,就算了吧

在样式比对时,修复了部分代码块和引用块的问题,同时还发现历史一些应该是通过 Live Writer 发的旧文,是一个单行超大的 HTML 语法,曾经在 WordPress 上转 Markdown 应该也是转到懒得转,这次先把和引用块的临时处理下,后面应该可以借助 AI 的能力可以快速批量处理

不过,加上本地搜索功能后,开发环境需要的依赖还是不少的,从 AI 帮项目生成维护的 README 里就能看到

必须工具

  • Git;
  • GNU Make 或兼容的 make
  • Python 3.11 或更高版本;脚本只使用标准库,不需要 pip/virtualenv;
  • Node.js 20 或更高版本及 npm;只用于按 package-lock.json 安装和运行 Pagefind;
  • Hugo Extended;当前验收版本为 0.165.0,建议其他机器使用相同版本,至少必须在
    hugo version 输出中包含 extended
  • 部署机器还需要 OpenSSH client,以及包含安全更新并支持 --link-dest 的 rsync。

可选工具:Docker 或本机 nginx,用于正式切换前的 nginx 配置和 HTTP 冒烟测试。

git 作为版本管理没有什么好解释的,AI 用 make 来串起各种动作,拿 python 运行各种转换和校验脚本,node 是为了安装运行本地搜索支持工具 Pagefindhugo 是本次核心迁移组件,另外用 sshrsync 是为了推送发布到 VPS

大头基本完成,后面应该就是把单页目录样式小组件做下样式和功能优化,把整站的主题做做美化,再把历史文章都想办法转成 Markdown 格式,就安心写东西吧

BuyVM VPS 安装优化记

BuyVM 的 VPS

早两周忘了是谁提醒了下, 说 buyvm 家 15$/yr 的 VPS 有货, 非常值得去抢, 当时估算了下这个价格确实算良心价, 虽然只有 128M 内存, 但作为一台自己的 vps 折腾点东西完全都够了的, 果断下手一台

这台机器打算拿来放一些自己玩的小程序, 同时把个人的空间和 blog 迁过来, 本还想拿这个机器做自己私有的翻墙中继, 不过试了下到本地的速度最高也没超过 30KB/s 过, 遂放弃, 等啥时候有烧包需要时去买 linode 在日本的节点好了

系统选择和基本设置

之前自己用 debian-server 做纯服务端的东西感觉很爽, 占资源少文档丰富, 出点问题也能很容易在 Google 帮助下搞定, 所以系统也选的 debian, 然后因为只有 128M 内存, 上 64bit 没意义, 而且会更耗内存一点, 所以选了 32bit 的版本

debian 有几个比较坑爹的地方, 首先就是新建用户默认不建 home 目录, 非要在 useradd 的时候强加 -m 参数指定, 不然还要人肉新建 home 目录兵把 /etc/skel/ 下的几个隐藏文件拷过来做初始化

然后就是如果不是 root 用户, /sbin 和 /usr/sbin 默认是不在 PATH 里的, 需要手动将这些路径打开, 不然连 ifconfig 什么的都用不了. 修改 /etc/profile 里, 将 PATH 设成全用户一致 (此处参考: http://techpoet.blogspot.jp/2010/01/add-sbin-to-user-path-in-debian.html)

自己有一堆常用的配置库放在 github 上, 直接 git 取下来放到 home 目录, 把一堆 rc 结尾的文件前面加点让对应的程序能读到. 特别的是 vimrc, 最好还是放到 /etc/vim/vimrc.local 下, 不然 sudo 的时候碰上的还是没配过的 vim, 挺不爽的

系统自带应用内存优化

因为只有 128M 的内存, 要做很多勒紧腰带过日子的准备, 先就是卸载一堆自带的服务, 释放宝贵的内存, 此处参考了 http://www.yyphs.com/post/475.html, 不过我只去掉了会启动的组件, 即如下操作

# 系统升级
apt-get update && apt-get upgrade

# 去除多余软件
apt-get -y purge apache2-* bind9-* xinetd samba-* nscd-* portmap sendmail-* sasl2-bin

# 清理软件包
apt-get autoremove && apt-get clean

LEMP 环境安装

Web 应用从早两年的 LAMP 现在都在转 LEMP, 主要还是把 Apache 这个巨无霸换成了相对小巧又耐操的 nginx, 自己之前用 nginx 感觉也相当好, 这次也把系统默认的 Apache 干掉换这个

一开始参考的 http://www.howtoforge.com/installing-nginx-with-php5-and-mysql-support-on-debian-squeeze, 安装 mysql, nginx, php 都很正常, 但是这里面提到 debian 没有 php-fpm, 所以用 lighttpd, 不过我装 lighttpd 后内存爆掉, 随便搜了下优化方案都搞不定, 卸掉, 还是用习惯的 php-fpm 方式跑 fastcgi

http://www.webhostingtalk.com/showthread.php?t=1025286 这个提示装上 php5-fpm, 从装 nginx 开始就用不上了, 后面的优化也先不用管, 一会一起处理 (wordpress 似乎还依赖一个叫 php5-apc 的包, 装的时候一起带上)

内存优化

上面那一堆装好后如果不做优化, 坨坨的爆内存, 所以该关的功能要关, 该调的参要调. mysql 的一个优化关键是要关 innodb, 然后 nginx/php-fpm/mysql 都要做的事就是降低同时运行的实例数, 减少连接数, 同时严格控制各处内存大小. 具体怎么配的也忘了, 主要参考的是搜到的这两篇里关于参数的配置

http://blog.log4d.com/2011/11/vps-lnmp-setup-config/ (主要参考其参数配置)

http://keithscode.com/blog/23-running-mysql-on-a-small-128mb-vps.html (主要参考其参数配置)

最后的内存占用如下 (目前运行状态, 装了 wordpress)

$ free
             total       used       free     shared    buffers     cached
Mem:        262144      88972     173172          0          0          0
-/+ buffers/cache:      88972     173172
Swap:            0          0          0

安装迁移 wordpress

先在 mysql 里建对应的数据库, 这个随便都能搜到, 自己碰到个坑是 mysql 分配数据库权限时用已有用户无法登陆, 最后还是删掉用户在分配权限时再新建用户, 用 identify 来设置密码

mysql> create database wp;
mysql> grant all privileges on wp.* to wp_user@localhost identified by 'wp_pass';

装 wordpress, 一切正常, 用老的文件, 改名备份 wp-config.php 直接访问 wp-admin/install.php
用导出的文件再导入 (大于 2M 的话需要修改 php 的上传限制: 修改 /etc/php5/fpm/php.ini 文件修改 upload_max_filesize 项)

之前用的是多说的评论系统, 把插件重新启用, 并绑定原来注册过的站点就能将评论恢复, 一切搞定

奇怪的问题

上面写的好像很容易, 实际上对一个新手 OP 来说还是非常磕磕碰碰的, 最后在 OP 之外还有些奇怪的问题

先是多说, 绑定站点时临时性卡死, 然后再导数据时有延迟, 再后面就有重复的评论出现, 但是又不是所有的评论都被重复一遍, 研究了半天没弄明白, 自己手动删掉了重复的

然后删重复数据时发现有一条奇葩的回复显示在了另一篇文章下, 还是一条二级评论, 但是在后台看对应的又是正确的文章, 而且文章下的评论数是对的, 就是不显示, 自己折腾半天都没弄好, 无奈去联系多说的技术客服, 周末不在线, 留言后觉得不放心, 又去 dev.duoshuo.com/wordpress-plugin 报了一遍才安心

今天终于找上人, 帮着看了下, 先让我把评论模式从嵌套改成盖楼, 发现果然显示在正确的文章下了, 但是错误的引用了一条另一篇文章下的评论, 而且引用的那条评论还在此评论后好几个月才发出来, 顺手看了下 HTML 源码, 发现多说也是按 评论(post-id), 文章(thread-id), 引用(root-id) 来组织的数据 (这跟 BBS 上的 pid, gid, rid 一样一样啊), 然后这条出错的评论应该是两边哪里没同步好, 导致其 root-id 出错, 而 root-id 对应的评论在另一篇文章下, 所以嵌套模式时就显示到那边去了, 而正确的文章下因为找不到对应的父评论所以也没显示, 而盖楼模式下不判断父评论所以能显示, 但是存在错误引用关系, 最后让帮忙手动将出错评论的 root-id 置零, 总算搞定

第二件事是一个陈年老问题还在, 一年多前就写过一篇爆流量记, 里面提到有人抓 win7.iso, 但是当时找不到证据说是谁, 迁到新站后还在被抓, 期间 404/302/416 轮着报了一年多错居然还抓, 怒了去看看到底都哪来的请求, 意外发现有很多标识 QQDownload 的请求, 从 momodi 那联系上 QQ 旋风的人, 跟他们 blabla 说了一堆, 结果估计他们也从来没碰到过这样的事, 说要不你先自己屏蔽掉? 我哭笑不得说现在对我倒没啥影响了, 反正就算屏蔽也耗系统资源, 而且现在每次给个 416 也费不了我多少流量, 只是觉得很不爽而已. 不过后来自己去找了下迅雷和旋风离线下载的 IP 段, 这几个好像又都不在里面, 贴下原始日志, 大家看看有啥想法没:

$ awk '/QQDownload/{cnt[$1]++};END{for(ip in cnt){print ip, cnt[ip]}}' access.log
101.226.68.137 196
140.207.54.139 195
183.195.232.138 196
$ awk '/cn_windows_7/{cnt[$1]++};END{for(ip in cnt){print ip, cnt[ip]}}' access.log
122.141.67.50 329
123.185.52.73 54
14.114.226.18 150
14.114.226.194 14677
14.115.129.55 4040
180.117.68.185 361
59.33.63.137 1476

抽几条完整日志如下:

101.226.68.137 - - [21/Apr/2013:19:44:18 +0800] "HEAD / HTTP/1.1" 200 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; QQDownload 713; .NET CLR 2.0.50727; InfoPath.2)"
14.115.129.55 - - [21/Apr/2013:19:44:18 +0800] "GET /ftp/Win7_rtm_with_loader/cn_windows_7_professional_x86_dvd_x15-65790.iso HTTP/1.1" 416 615 "http://yewen.us/" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)" 
14.115.129.55 - - [21/Apr/2013:19:44:22 +0800] "GET /ftp/Win7_rtm_with_loader/cn_windows_7_professional_x86_dvd_x15-65790.iso HTTP/1.1" 416 615 "http://yewen.us/" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)" 
14.115.129.55 - - [21/Apr/2013:19:44:25 +0800] "GET /ftp/Win7_rtm_with_loader/cn_windows_7_professional_x86_dvd_x15-65790.iso HTTP/1.1" 416 615 "http://yewen.us/" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)"