jekyll搭配markdown写作是一件非常方便的事情,可以直接在本地写完,然后使用git进行版本控制。然而,鉴于当前恶劣的网络环境,寻找一个稳定的、能用的jekyll平台变得非常困难。github由于是国外公司,ghpages经常无法正常访问,而国内的一些git平台,虽然速度通常快很多,但是条款经常变化。例如,我曾经使用了一阵子gitee,但是后面这个网站只能Pro版的用户定制域名,甚至在后面因为需要清理站点,几个月无法提交pages服务。而coding.net网站,也是开始好好的,后面就和腾讯云合作,jekyll的运行环境变得不定,特别容易发生提交出错。

那么,如果自己有服务器,且是Windows服务器的情况下,如何安装jekyll环境呢(Ps,最近腾讯云有那个轻量级应用服务器,60元就可以玩一年,所以买了一个做测试。)。

jekyll环境的安装

gem install jekyll
gem install jekyll-paginate
gem install jekyll-minimal

安装完成之后,运行jekyll server即可生成服务。不过,后面为了放在后台运行,可以使用powershell脚本的Start-Process命令。

编写应对hook的脚本

类似github、gitee等软件平台,提供push等事件的hook。即如果我们将编写的post提交到网站上,将触发一个hook事件,调用一个我们提供的网址。这个时候,我们可以使用powershell编写一个简单的http服务器,当接收到hook的请求,脚本就将网站中的repo更新到本地,从而达到更新网站的目的。很多网站都会提供密码验证服务,避免收到攻击。

对于http服务器的创建,可以使用python脚本,只需要非常简单的的几行就可以。不过需要安装python解析器。如果实在较新的windows系统中,还可以基于powershell脚本使用System.Net.HttpListener去实现。需要注意通常的hook必须是实现了POST请求类型,如果没有,可能导致超时错误。

$http = New-Object System.Net.HttpListener

由于使用git更新repo内容,尤其是提交的东西较多或者网络不好时,是一个较为耗时的过程,容易导致hook调用发生time out错误。此时,可以使用ps中的Start-Job功能,将这个耗时的动作放在背景线程中去执行,例如:

Start-Job -ScriptBlock{
    Push-Location -Path "location of your git repo"
    git pull
    Pop-Location
}

注明Start-Job执行的背景线程,依赖于主线程。如果主线程关闭,背景线程也将会关闭,此与Start-Process不同。

后台运行

  • 运行jekyll
Start-Process powershell -WindowStyle Hidden -ArgumentList "jekyll server"

后台的进程实际有Ruby执行。

  • 运行HttpListener脚本
Start-Process powershell -WindowStyle Hidden -ArgumentList "powershell_script_filepath"
  • 运行nginx(前端服务器)
Start-Process nginx -WindowStyle Hidden

exe程序可以独立运行,不需要借助于powershell。在nginx的配置文件中,将powershell的HttpLisener和ruby的jekyll脚本设置为后端代理,nginx作为前端处理流量。这样可以实现多个域名对应多个服务器了。

错误解决

安装完成之后,可能发现标题带有中文的页面无法访问,这个时候可以参考一下网页解决: https://guosongyu.github.io/2020/01/jekyll%E4%BD%BF%E7%94%A8%E4%B8%AD%E6%96%87%E8%B7%AF%E5%BE%84,主要是Ruby处理中文字符出现的编码问题,将编码设置为utf-8即可。