通过 Git Hooks 自动部署 Hexo 到 VPS

之前博客是搭建在 GitHub 上的,可是因为折腾博客的时候总会 post 一堆 commit 记录,这让强迫症的我上去着实心烦,另外手头的 VPS 只拿来搭梯子实在有点浪费,所以决定迁移到 VPS 上。本来几个月之前就尝试过一次,然而当时都是卡在中途的一些小问题上,前几天再次尝试终于成功,遂记录之。

静态博客

静态博客指的是使用静态页面的博客,这些网页都是提前生成好的,不需要数据库,并且内容不会动态改变,与 WordPress 等动态博客相比,静态博客具有以下优点:

  1. 加载速度快,这是静态页面的优势,然而服务器网络访问差可能会让这一点变得毫无意义比如你现在看到的我的博客
  2. 占用资源少,只需要一个 Web 服务器引擎即可,我的博客现在就运行在内存只有 64 MB 内存的 VPS 上;
  3. 易于维护、迁移,基本上你要操心的只有文本格式的源文件前提是你不折腾其他的劳什子😀

当然静态博客也有一些缺点,比如对新手不友好、每次修改配置都需要重新生成博客、文章数量多的时候博客生成速度慢等。最大的缺点就是只能在一台配置好环境的机器上发布文章。

常见的静态博客引擎

Jekyll

Jekyll 是使用 Ruby 语言编写的,也是 Github Pages 默认支持的静态博客引擎。

Hexo

使用 Node.js 编写,在 Hexo 的官网上是这样描述 Hexo 的:

A fast, simple & powerful blog framework

意为「快速、简洁且高效的博客框架」 ,通俗的来说,Hexo 是一个静态博客生成引擎,用户可以使用文本编辑器写作,然后再用 Hexo 生成 Html 文件。相比 Jekyll,Hexo 的速度更快,而且有众多风格的主题供用户选择,比如我的博客用的就是 Next。Hexo 的作者是来自台湾的 Tommy Chen

Pelican

Pelican 则是用 Python 编写的。支持使用 restructuredTextMarkdown 写文章。

Markdown

最早是从「简书」上《献给写作者的 Markdown 新手指南》这篇文章中才知道 Markdown 的,Markdown 是知名科技博客 Daring Fireball 的作者 John Gruber 为了更方便的写博客而提出的一种轻量级标记语言,也是「简书」所一直倡导的一种写作方式。 Markdown 的语法非常简单,你可以很方便的对文章进行排版,并且采用纯文本内容,可以使用任何一个文本编辑器去书写。

Markdown 的语法自从 V1.0.1(2004)就再也没有更新过,因此一开始在各个支持 Markdown 语法的书写工具上都有各自不同的 Markdown 扩展语法,并没有一个统一的标准。

一群来自 Stack Exchange、GitHub、Reddit 以及其他组织的代表发起了对 Markdown 进行标准化和功能增强的项目,名字为 Standard Markdown。但是他们的努力遭到了 Markdown 语法创建者 John Gruber 的反对,John Gruber 不希望 Markdown 用在其他项目中,所以标准化项目最后改名为 CommonMark

推荐使用 Moeditor,一款外观十分优雅的 Markdown 编辑器,类似的还有 Typcho

2017 年 05 月 25 日更新 目前博主在使用 Sublime 文本编辑器 + Kconfig Syntax Highlight 语法高亮插件编辑博客文章。

准备工作

实现原理

在 VPS 上搭建 Hexo 其实和在 GitHub 上面没有多大区别,同样是在本地编辑文本,然后使用 Git 远程部署到 Git 仓库。只不过在 VPS 上面需要配置 Git Hooks 将博客文件自动 push 到 Web 根目录。

本地操作

由于之前博客部署在 GitHub 上面,所以本地已经安装配置了 Hexo,这里简单回顾一下。

安装 Git 和 Node.js

本地需要安装 GitNode.js,安装过程略。关于 Git 的配置和学习推荐廖雪峰的 Git 教程

Windows 上安装 Git for Windows 之后在开始菜单里打开 Git Bash 输入:

1
2
git config --global user.name "你的用户名"
git config --global user.email "你的电子邮箱"

由于 Hexo 的 Git 部署不支持使用密码登陆,所以需要配置 SSH 公钥:

1
2
3
4
cd ~
mkdir .ssh
cd .ssh
ssh-keygen -t rsa

在系统当前用户文件夹下生成了私钥 id_rsa 和公钥 id_rsa.pub

初始化 Hexo

在电脑任意目录新建一个文件夹 hexo,进入文件夹,在空白处点击右键选择 Git Bash,输入:

1
2
npm install -g hexo-cli
hexo init

这样便在本地初始化了 Hexo 文件夹,然后输入:

1
hexo new post "Hello World"

即可新建一篇文章,用文本编辑器打开 hexo/source/_post/Hello World.md 可以快速开始写作。其余使用方法和配置按照 Hexo 官网操作即可。

修改 deploy 参数

打开位于 hexo 文件夹下的 _config.yml,修改 deploy 参数:

1
2
3
deploy:
type: git
repo: git@blog.yizhilee.com:hexo.git

VPS 配置

关于部署到 GitHub,网上有很多教程,这篇博客着重记录部署到 VPS 的方法。
服务器使用 Ubuntu 发行版,版本号是 16.04。

新建用户

1
2
adduser git
passwd git

git 用户添加 sudo 权限:

1
gpasswd -a git sudo

上传 SSH 公钥

这里为了方便起见同时避免出错,使用 ssh-copy-id,在本地打开 Git Bash 输入:

1
ssh-copy-id -i ~/.ssh/id_rsa.pub git@服务器ip地址

我当时在这一步出了点问题,一开始我是用复制粘贴,配置完之后还是需要密码,后来换用 ssh-copy-id 命令,一次就成功了。

安装 Git , Nginx

更新源

1
2
su git
sudo apt-get update

安装

1
sudo apt-get install git-core nginx

配置 Git

Git 仓库

1
2
3
mkdir hexo.git
cd hexo.git
git init --bare

创建网站目录

1
2
cd /var/www
mkdir hexo
变更权限
1
chown git:git -R /var/www/hexo

配置 Git Hooks

1
cd ~/hexo.git/hooks
编辑post-receive文件:
1
2
3
4
5
6
7
8
9
10
vi post-receive

#!/bin/bash
GIT_REPO=/home/git/hexo.git #git 仓库
TMP_GIT_CLONE=/tmp/hexo
PUBLIC_WWW=/var/www/hexo #网站目录
rm -rf ${TMP_GIT_CLONE}
git clone $GIT_REPO $TMP_GIT_CLONE
rm -rf ${PUBLIC_WWW}/*
cp -rf ${TMP_GIT_CLONE}/* ${PUBLIC_WWW}
赋予可执行权限:
1
chmod +x post-receive

配置 Nginx

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
vi /etc/nginx/conf.d/hexo.conf

server {
listen 80 ;
root /var/www/hexo;
server_name blog.yizhilee.com;
access_log /var/log/nginx/hexo_access.log;
error_log /var/log/nginx/hexo_error.log;
location ~* ^.+\.(ico|gif|jpg|jpeg|png)$ {
root /var/www/hexo;
access_log off;
expires 1d;
}
location ~* ^.+\.(css|js|txt|xml|swf|wav)$ {
root /var/www/hexo;
access_log off;
expires 10m;
}
location / {
root /var/www/hexo;//这里可以改成你的网站目录地址,我将网站放在 `/var/www/hexo`
if (-f $request_filename) {
rewrite ^/(.*)$ /$1 break;
}
}
}

然后重启 Nginx:

1
/etc/init.d/nginx restart

发布文章

在本地编辑好文章之后使用 hexo g 生成静态网页,hexo s 在本地预览,hexo d 提交到服务器。

后记

在整个配置过程中遇到了一些小的问题,基本上是配置信息填写错误、路径、权限之类的问题。

这篇文章是在配置成功几天之后写成的,仅作为记录之用。由于个人水平限制难免有不合理之处,大概以后还会修改吧。

参考链接

  1. Hexo 建站从入门到精通 - Hexo 博客本地环境配置,初始化,写作与部署
  2. 在 VPS 上搭建 Hexo 博客,利用 Git 更新