我刚刚完成了将这个博客从Ghost迁移到Jekyll的工作。
为什么
Ghost为我服务了很长时间,但它最终达到了一个地步,即维护它比我从它那里得到的更多努力。
我在自己的服务器上自行托管Ghost,而且已经很难跟上Ghost的升级了。有些升级非常简单,但至少有两次重大升级需要大量工作。我担心,如果我不跟上,我就会让我的网站出现安全漏洞。
相比之下,Jekyll是一个静态网站生成器。产生的博客只是一堆由nginx提供的静态文件,所以安全问题的风险大大降低。
静态网站的托管也更简单,使用的CPU和内存资源也少得多。
虽然我很欣赏Ghost的许多功能,但对我来说,在我的笔记本电脑上用markdown写博文并不困难。而且,能够在本地和我的托管服务器上看到完全相同的博客,这很好。
转换的一个附带好处是,我的一些旧文章现在看起来好多了。原来的格式在转换到Ghost时被破坏了,而现在转换后的Jekyll标记看起来更好了。
迁移
我从jekyll_ghost_importer开始,它给了我一个很好的基线,但留下了一些问题。
- 一些链接缺少markdown包装。
- 帖子缺少作者,这是主题所要求的。
- 帖子的日期是UTC,但没有指定时区,所以有些帖子由于时区转换而显示在错误的一天。
我用一个Ruby片段修复了这些问题,比如。
Dir.glob("_posts/*").each do |post|
contents = File.read(post)
updated = contents
.gsub(%r{(\s)(https?://.*)(\s)}, "\\1[\\2](\\2)\\3")
.sub("---\n\n", "author: Paul\n---\n\n")
.sub(/date: '(.+)'/, "date: '\\1 UTC'")
File.open(post, "w") { |f| f.write(updated) }
end
接下来,我浏览了一堆Jekyll主题,直到找到一个我喜欢的简单主题:tale。我还调整了关于页面。
然后,我配置了Discuz、Google Analytics,并为我的旧RSS feed添加了重定向。我还改变了固定链接,使其包括一个尾部斜线,以配合Ghost。permalink: /:year/:month/:day/:title/
我添加了一个简单的脚本来部署。
JEKYLL_ENV=production jekyll build
rsync -avz --delete _site/ pgrs.net:/var/www/blog/
最后,我检查了一下,以确保我的顶级帖子仍然有效,并且看起来不错。我抽查了一些,但我想确保我所有的热门帖子都保持它们目前的URL。我从Google Analytics下载了我的50个最受欢迎的帖子,并把它们放在一个文件中。然后,我写了一个简单的wget 命令,以检查它们是否都返回了一个成功的响应。
wget -q --spider -i <file of URLs>
echo $? # exit code of 0 means success
后果(2018年11月27日更新)
在我进行了切换之后,我观察了几天我的服务器日志,看是否有异常情况。我发现了一些重要的事情。
缺少的404s
如果一个页面没有找到,我的nginx设置将呈现404错误页面,但作为一个成功的200响应,而不是正确的404响应代码。这在浏览器中看起来是正确的,但对搜索引擎和其他机器人来说是不正确的。
我通过在我的server 块中添加这个来解决这个问题。
error_page 404 /404/index.html;
然后在我的location 块中加上这个。
try_files $uri $uri.html $uri/index.html =404;
=404 告诉nginx,如果它找不到静态文件,就提供一个404响应,而error_page 告诉它要渲染哪个页面。
破碎的AMP URLs
我的Ghost博客曾经为加速移动页面(AMP)提供服务,在每个帖子的URL末尾都有一个尾巴/amp/ 。我的新Jekyll没有这样做,这导致日志中出现了很多404。我不确定有多少错误显示给用户,而谷歌只是提供了一个过时的页面版本。
在任何情况下,我通过将AMP链接重定向到主帖来解决这个问题。
rewrite ^(.*)/amp/?$ $1 last;
我验证了非AMP页面在我的手机上看起来不错。
谷歌似乎仍有一些AMP页面被缓存,但希望这些会随着时间推移而消失。
不正确的日期URL
我注意到在我的日志中,有许多对日期不正确的帖子的请求出现404。例如,他们会请求/2018/11/27/foo ,而不是/2018/11/26/foo 。
我发现Ghost似乎并不介意日期不正确的情况。它将正确地重定向到正确的URL。然而,Jekyll的静态网站却很在意,这些都是404。
我试图弄清楚这些不正确的URL是怎么来的。我最好的猜测是,Ghost的一个老毛病在一定时间内把帖子放在了错误的URL上:https://github.com/TryGhost/Ghost/issues/7655。我很久以前就部署了固定的版本,但我认为这些错误的URL进入了搜索索引。
由于日志中的404似乎只是来自机器人,而我的Ghost博客上的问题可能已经修复了很长时间,我想留下这些404是可以的。我仔细检查了美国主要搜索引擎的搜索结果是否返回了正确的URL。