带着hexo来问好

早就想从wordpress换成hexo,因为想好好体验一下markdown编辑博客,而且直接用html语法直接实现文章样式的修改。只是一直没有契机。
最近因为想给自己的站加上https,所以在阿里云上买了个云主机,顺势把博客也搬到了阿里云。既然有了云主机,索性搭了个hexo环境,尝试把wordpress的文章导入hexo里。不过这两天折腾下来,发现自己原先有一些误区,用牢骚的方式记录一下。

Hexo简介

Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。

原先看着这段简介以及网上的文章,只了解到hexo使用markdown语法写作,并且最终的文章是以静态页的方式呈现出来。同时支持将静态页部署到github pages上。那么倘若我部署在服务器上,应该用法和wordpress一样的吧。可是事实证明,我似乎太天真。

实际上,hexo正确的打开方式是,写好md文章用hexo generate生成好静态页,倘若使用github pages,则再用hexo deploy命令部署到github上;若自有服务器,则把静态页丢到服务器上的web目录让用户访问就可以了。hexo的hexo server只推荐用来本地调试。

然而既然我已经买了云主机,似乎只丢静态文件到服务器上,有点太浪费资源了。所以还是在服务器端装好hexo,一条路走到了黑。

Hexo部署

hexo的部署很简单,他们的官方文档写的很详细了。对照着安装然后生成站点文件夹即可。

Hexo文章导入

从wordpress导出我所有的文章和网页,用hexo支持的方式导入这些文章。我在导入结束后发现转换后的文章,markdown解析起来全乱掉了。没办法只能这两天熬夜把所有的文章重新用markdown支持的语法改了一遍。庆幸自己不是话痨,写的文章还不算多。

启动博客

修改好站点配置文件以及主题配置文件,用hexo generate命令生成静态文件,在nginx配置文件里将网站根目录指向public文件夹即可实现访问。

文章更新

因为hexo是静态站点,不像wordpress自带后台可以直接发布文章。为了方便更新,以及实时备份的目的,我还是借助了git的力量。不过鉴于国内访问github速度感人,我选了国内的产品

程序文件纳入git

在hexo程序目录里,使用git init将目录git化,然后提交目录里的文件至git仓库。具体操作如下

1
2
3
4
git add .
git commit -m 'hello hexo'
git remote add origin '你的git仓库地址'
git push -u origin master

使用webhooks实现自动更新

基本上这些类github产品,都有webhooks。有了webhooks,就可以实现在远端库更新之后,POST一段json数据到服务器,让服务器执行一系列更新文章的命令。这里我在网上找到有现成的代码接收POST数据,作者传送门

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/env python
# -*- coding:UTF-8 -*-
import urllib
import json
from BaseHTTPServer import HTTPServer,BaseHTTPRequestHandler
class RequestHandler(BaseHTTPRequestHandler):
def _writeheaders(self):
print self.path
print self.headers
self.send_response(200);
self.send_header('Content-type','text/html');
self.end_headers()
def do_Head(self):
self._writeheaders()
def do_GET(self):
self._writeheaders()
self.wfile.write("""""" str(self.headers))
def do_POST(self):
self._writeheaders()
length = self.headers.getheader('content-length');
nbytes = int(length)
data = self.rfile.read(nbytes)
self.wfile.write('ok')
# print data
data = urllib.unquote(data)
data = data[5:]
# print data
json_obj = json.loads(data)
commits_cnt = len(json_obj['push_data']['commits'])
print commits_cnt
for i in range(commits_cnt):
# print i
print json_obj['push_data']['commits'][i]['message']
if __name__=="__main__":
addr = ('',8765)
server = HTTPServer(addr,RequestHandler)
server.serve_forever()

秉着拿来主义,在上述代码中自己添加了当message字段值为特定值时,去更新静态文件的功能。自动更新效果演示如下图

这篇文章是用git提交并自动在服务器上生成的第一篇文章。Nice~