转到Typecho
2007年之前我用过MSN Space等第三方博客服务,当他们相继倒下之后我就发现数据不在自己手中心里很难踏实,于是乎我开始搭建独立博客。从07年到现在大概有六百多篇,主要是在学校的时候发的内容,大部分质量不高,但承载了很大一部分当时稚嫩、艰辛与快乐对的回忆。
虽然博客可能不再是互联网的主流,但对于个人来说写一篇博文往往比在微博类应用上发一些快餐式的内容更有价值,至少这些是属于作者的永远的财富。
为什么换Typecho
翻翻近两年的博客可以发现,自从工作后基本上就没有再认真写过东西了:
- Emlog后台太臃肿且小问题多,很难专注写作;
- 工作忙与琐事多,没时间写;
- 新学的技术不多,主要精力在传统行业;
- 行动慵懒与思维懈怠,这才是主因。
为能让自己重新开始写点有营养的内容,需要逐条克服上述问题,尤其是行动的慵懒和思想的懈怠。
生命不止,折腾不休。从最早用的Boblog,和转到Emlog,我向来都不用主流的博客程序,所以这次也不例外啦。除此之外Typecho的简洁和原生MarkDown语法支持深深地吸引了我(虽然事后证明最新版本的HyperDown还是很不成熟)。
Emlog转Typecho过程
1.数据库转换
用到isaced的Python脚本,这是Python2的版本,我稍微修改成了能在Python3.5下运行对的版本,同时尝试用html2text来将以前HTML格式的日志转成MarkDown的语法,但是由于博客数据经过几个程序不停的转换,UBB和HTML胶着且格式不统一,转换出来惨不忍睹,现在这个样子最新的文章应该基本能看,老早的文章以后抽时间再折腾吧。
2.附件路径修正
Boblog的附件是在/attachment文件夹,Emlog在/content/uploadfile中,先在Typecho根目录建立/usr/uploads文件,再将原来的附件cp过来,然后在转换好的数据库中替换相关内容:
update typecho_contents set text=replace(text,'/content/uploadfile','/usr/uploads')
update typecho_contents set text=replace(text,'/attachment','/usr/uploads/attachment')
再在nginx相应配置中添加以下内容禁止上传目录执行php程序:
location /usr/uploadfile {
location ~ .*\.(php)?$
{
deny all;
}
}
顺便处理一下网站目录权限(nginx和php-fpm都是用nginx用户及用户组运行,假设typecho安装在~typecho目录):
cd ~typecho
chown -R nginx:nginx .
chmod g+s .
find . -type f -print0 | xargs -0 chmod 440
find . -type d -print0 | xargs -0 chmod 550
chmod 770 usr/uploads/
chmod 770 usr/plugins/
chmod 770 usr/themes/
具体的作用可以参见这里,现在附件和图片基本上都没问题了,发现还有几篇文章因历史原因丢失了图片路径,好在附件没丢,我有空再修复一下,这里暂时Mark一下:)
3.适应性修正
- 兼容Emlog的URL
在后台中将自定义文章路径和独立页面路径改为/{slug},分类路径改为/sort/{slug}/,并在nginx相应区域添加如下内容使得原emlog的rss继续能用:
rewrite ^/rss.php https://holmesian.org/feed permanent;
- HTTPS问题
Typecho使用全站HTTPS的话后台样式无法正常显示,检查后发现是/admin/head.php的css、js等资源还是通过http方式拼接,最简单的方式是在config.inc.php加入如下内容,启用PHP程序层面的HTTPS支持:
define('__TYPECHO_SECURE__',true);
- Nginx Rewrite问题
后台样式显示正常之后,仍然无法正常登录,根据这篇文章提到的问题,考虑我的主机通过Haproxy对443端口进行了端口复用,后端HTTPS服务使用的是4431端口,做了相应的修改后问题依旧,仔细分析后终于搞清楚问题的症结在原Emlog用的Rewrite规则不完全支持Typecho,官方提供的规则使用了if,而在nginx里if属于rewrite模块的一部分,nginx不那么推荐使用if,更多的内容可以参见这里。于是自己写了一个:
try_files $uri $uri/ /index.php?$args;
location ~ .*\.php(\/.*)*$
{
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/tmp/php-fpm.socket;
fastcgi_index index.php;
include fastcgi.conf;
}
- 后台安全
由于Typecho的默认后台地址为admin,且不能直接修改,为了预防可能出现后台相关的0Day,建议在nginx中对后台添加额外的username:passwor访问验证:
htpasswd -b -c /etc/nginx/site_pass username password
生成密码文件
location /admin/ {
auth_basic "Need not to know!";
auth_basic_user_file /etc/nginx/site_pass;
}
在nginx相应区域添加上述配置内容,因为已经做了全站SSL,所以在没有被MITM的情况下auth_basic的密码还是相对安全的。
- HyperDown问题
新版本Typecho用HyperDown来解析MarkDown,用<!--markdown-->来标记需要使用MarkDown编译的内容,正如一开始说的HyperDown还有一些不完善的地方,日志会间歇性出现这个问题:
PHP message: PHP Fatal error: Using $this when not in object context in /data/www/typecho/var/HyperDown.php on line 342
由于是间歇性故障,所以这是折腾最久的问题:错误提示的位置是private function parseInlineCallback($text),置空掉这个函数虽然可以解决问题,但是部分字体格式会失效。为了彻底解决问题,最终还是使用Parsedown插件来解析。
- 评论问题
评论也是本来也应该掌握是在自己手上的数据之一,但是由于这里前端443端口复用导致nginx在后端不能得到https客户端的真实IP,为了解决这个问题我把评论导入多说,以后直接使用多说的服务并同步回写到本地服务端,回写需要php-curl支持。
- 其他问题
Emlog中未公开的文章及其评论和未审核的评论在导入到Typecho之前务必清理好,否则会导致Typecho出错。需要取消动态页输出头中Pragma:no-cache的话,修改php.ini的session.cache_limiter参数为none。
最后
就是现在看到的这个样子啦,同时这篇文章也是通过MarkDown方式写完的,沉浸式的写作方式真的很棒,接下来就是要坚持写作啦。