使用 Vercel 托管 Hexo 静态博客

博客本来用的是 github pages,但貌似由于百度爬虫太疯狂,被 github 给 ban 掉了。根据 marketmechian 的数据,在中国大陆搜索引擎界,百度还是占了半壁江山:

  • Baidu: 67.09%
  • Sogou: 18.75%
  • Shenma: 6.84%
  • Google: 2.64%
  • bing: 2.6%
  • Other: 2.08%

而作为一个中文博客,还是希望能够被更多的国内用户看到,因此一直在寻求一个使得百度爬虫自动爬取博客的方法。偶然间在浏览博客时,看到了有人在推荐 zeit.co 这个托管平台,使用了下,发现真是个非常棒的静态代码托管+CI Serverless Function 平台,在这里推荐给大家。

作者:木鸟杂记 https://www.qtmuniao.com/2020/03/15/hexo-to-zeit-co/, 转载请注明出处

几种方法

网上有很多方法可以使百度爬虫爬取博客页面,总结起来主要有:

  1. CDN,利用云服务提供商将 blog 多做几个镜像。
  2. 换托管平台,比如说国内的代码托管平台。
  3. 自行使用 VPS 托管。

CDN 比较贵,又不想换托管平台,VPS 大陆访问速度不快。因此这件事一直搁置。

zeit.co(vercel)

这天在搜索资料时,注意到有博主 [1] 提到 zeit.co,一个静态网页和无状态函数托管的云平台。试用了之后,感觉非常强大,它能够以 Github App 的形式与 GitHub 集成,接管 repo 的 CI,进行深度定制,并且能够快速部署、自动伸缩。

关键是,现在基本功能是免费的,这对于我们托管博客来说,已经很够用了。更惊喜的是,它还提供智能 CDN 和智能 DNS。

zeit-price.png

改造

了解到 zeit 的优势后,就开始着手改造博客的托管方式。主要有以下几个步骤:

  1. 静态代码生成修改
  2. 代码库导入 zeit
  3. 修改 dns 指向

静态代码生成

并不是所有人都需要这一步,我需要只是因为之前不太懂 hexo 的工作机制,自己坑了自己。

之前我只使用了一个 repo 来管理所有博客代码:用 master 分支作为 hexo 开发分支,使用 gh-pages 分支作为静态代码分支,然后将 repo 的 github pages 指向 gh-pages 分支,以发布博客。

由于 zeit 只能给 repo 的默认分支(即 master)做 CI,因此使用 zeit 托管 hexo 博客至少有两种方式:

  1. 托管 Hexo 开发代码。使用 zeit 接管 hexo 仓库代码,并为其配置 CI:每次往 master push 代码时,触发 CI,编译生成静态网页代码到 public 文件夹,然后将 public 文件夹发布。
  2. 托管静态网页代码。让 hexo 每次将静态网页代码生成到一个新的 repo 的 master 分支,然后将该 repo 导入到 zeit 进行托管。

我使用第一种的时候,发现 hexo build 老是失败,后面发现是我由于深度定制 NexT,修改了 NexT 主题的一些代码,但是并没有将其提交到仓库中。因为我本地的 NexT 主题代码仍然通过 git 关联着官方 NexT repo,以便及时 pull 最新特性,所以没有将其纳入 hexo 的仓库中。这一块深究一下应该也有解决方案,但是我懒,就选择了更简单的第二种托管方式:

将 hexo 代码库中配置文件 hexo/_config.yml 中部署方式修改如下:

1
2
3
4
5
6
78 # Deployment
79 ## Docs: https://hexo.io/docs/deployment.html
80 deploy:
81 type: git
82 repo: https://github.com/you-git-name/blog-publish.git
83 branch: master

每次执行命令 hexo d -g 时,就会将生成的静态网页代码 push 到 repo blog-publish 下:

zeit-repo-publish.png

这样还有额外的好处,就是以前我很蠢的将各种配置(包括我的一些网站的秘钥)暴露在了 git 的公共仓库中(因为 private 仓库不能用 github pages),使用第二种部署方式,我将我的开发 repo 和静态代码 repo 都设置为了 private。此外,zeit 会获取导入 repo 的所有读写权限,还是有点小颤抖,因此,搞一个额外的静态代码 repo 在这里很合适。

代码 repo 导入 zeit

Zeit 网页界面很简洁,还算比较好用。

注册。打开登陆页面:https://zeit.co/login,使用 GitHub 账号登陆即可。

导入。在主页面点击 “Import Project”,然后 “Import Project From Git Repo”,选择 GitHub。进行一下授权,注意只需导入静态代码仓库 blog-publish

部署。导入过程中,选择 other 模板即可,默认 ci 命令不用改,Root Directory 也不用改,导入完成后就会自动帮你 deploy。

最后在部署卡片中就可以看到 zeit 生成的 URL:

zeit-deploy.png

修改 DNS 指向

如果你有自己的域名,需要在域名服务提供商(阿里云、GoDaddy等)的 DNS 解析中增加一条 CNAME 记录(将你的域名指向另一个域名):

1
www  CNAME	默认	blog-publish.now.sh.	0	600

百度爬取

最后在百度站长工具页面,在 数据监控 > 抓取诊断,进行测试。

坑爹的是,我之前在域名解析时为百度爬虫配置了专门的线路,让其去我的 vps 抓取(当然最后没有成功,不然也就不会有本文了)。现在将那条记录去除后,百度爬虫这边时时不更新我的域名所对应 IP,点击报错后,提示几分钟后更新,然而几个小时过去了,依然未更新,当然这就是后话了。

zeit-baidu.png

参考

[1] 解决百度爬虫无法爬取 Github Pages 个人博客的问题:https://zpjiang.me/2020/01/15/let-baidu-index-github-page/

[2] zeit.co 帮助文档:https://zeit.co/docs


我是青藤木鸟,一个喜欢摄影、专注大规模数据系统的程序员,欢迎关注我的公众号:“木鸟杂记”,有更多的分布式系统、存储和数据库相关的文章,欢迎关注。 关注公众号后,回复“资料”可以获取我总结一份分布式数据库学习资料。 回复“优惠券”可以获取我的大规模数据系统付费专栏《系统日知录》的八折优惠券。

我们还有相关的分布式系统和数据库的群,可以添加我的微信号:qtmuniao,我拉你入群。加我时记得备注:“分布式系统群”。 另外,如果你不想加群,还有一个分布式系统和数据库的论坛(点这里),欢迎来玩耍。

wx-distributed-system-s.jpg