Hexo部署笔记

如你所见,这个网站是基于Hexo的。现在基于我自己的部署步骤,记录一下整个部署过程。

本来,要搞一个个人博客,我之前想采用的是WordPress。但是在国内,不知道WordPress的官网抽了什么风,我当时在下载时动不动就来一个429 Too Many Requests错误,这就算了,在我要下载安装一些插件时,这个429 Too Many Requests错误便阴魂不散。所以干脆就用了hexo。

什么是Hexo?

根据Hexo官网的说法,Hexo是一个快速、简单、强大的博客框架。我们可以用Markdown或其他标记式语言来写文章,Hexo将为我们生成静态的网页文件,并配上漂亮的主题。

重点在“静态”这两个字上。这意味着,与WordPress这样的有一个后台管理界面之类的动态网站不同,Hexo做的事情是把你用Markdown写的文章转换成浏览器可以直接查看的网页,所以,你要在本地写好你的Markdown文件,在本地用Hexo转换成网页,然后将这些网页文件上传到服务器的对应位置。因此,所有对文章的改动都是在本地进行,然后上传到服务器的,这和你登录服务器的后台界面写博客完全不同。也正因为如此,有许多人觉得Hexo比较麻烦,因为他们不熟悉从本地上传到服务器的工具比如git;而许多人则觉得Hexo特别简单方便,因为上传的是静态文件,因此服务器不需要进行太多的配置(比如安装数据库、PHP等),甚至只需要上传到GitHub Page、Coding等平台就能直接开一个属于自己的网站。

那么言归正传,开始Hexo的搭建。

本地操作

下面的操作都是在Ubuntu系统下完成的。

首先,我们要安装两个必要的软件:Node.js和Git。Hexo靠着Node.js来生成静态文件,靠着Git完成一些初始化和上传到服务器的操作。

安装Node.js

虽然许多Linux发行版在官方仓库中有Node.js,但是版本可能不能满足要求,因此去Node.js的官网去下载Node.js可能是更好的选择。

鉴于国内微妙的网络状况,去这个网站下载需要的版本也是可以的。Linux选择Linux二进制文件。

解压下载下来的文件,并把它放到一个合适的文件夹下,比如/usr/local/nodejs(每行最开头的$是命令提示符,不用输入,node-v12.14.1-linux-x64.tar.xz请按照实际下载的安装包名字为准):

1
2
$ sudo mkdir -p /usr/local/lib/nodejs
$ sudo tar -xf node-v12.14.1-linux-x64.tar.xz -C /usr/local/lib/nodejs

然后编辑~/.profile(如果想让系统中的所有用户都能使用Node.js,就编辑/etc/profile),在最末一行添加(node-v12.14.1-linux请注意改成实际情况下的Node.js版本):

1
export PATH=/usr/local/lib/nodejs/node-v12.14.1-linux/bin:$PATH

保存后,重启终端,或者直接在终端激活设置:

1
$ source ~/.profile

测试一下Node.js和npm是否安装成功:

1
2
3
4
$ node -v
v12.14.1
$ npm -v
6.13.4

只要不提示类似于找不到命令之类的信息,安装就成功了!

安装Git

直接一行命令搞定:

1
$ sudo apt install git

安装Hexo

鉴于国内微妙的网络环境,给npm设定一个国内的源,不然默认的下载源会慢得让人怀疑人生:

1
$ npm config set registry https://registry.npm.taobao.org

开始安装:

1
$ npm install hexo-cli -g

现在创建一个空文件夹,然后进入这个目录,这里用blog作为空文件夹的示例:

1
2
$ mkdir blog
$ cd blog

blog目录里面,初始化Hexo:

1
2
$ hexo init
$ npm install

由于需要下载一些文件,所以每条命令都可能需要耐心等待。

测试Hexo

现在,Hexo已经安装完成。你可以做这么一些操作:

hexo new 文章名:这将在目录中的source/_post文件家下生成一个文章名.md的Markdown文件,编辑这个文件就能创建一个文章了。如果要删除一篇文章,删除这个文件就行了。

hexo g:生成静态文件,静态文件将保存到public文件夹下——一开始没有这个文件夹时会自动创建。这就是用来在浏览器进行展示的部分。

hexo clean:将生成静态文件全部删除。

hexo s:在本地开启一个服务器用来测试Hexo的效果。

服务器操作

现在,登录你自己的服务器,开始操作。

安装Git和Nginx

服务器首先需要能够允许本地机器将文将上传上来,这里我们使用git,要展示网页,需要一个HTTP服务器软件,这里我们选择nginx。

1
$ sudo apt install nginx git

配置Hexo仓库

我们可以先新建一个git用户。当然你不想新建也可以,但我后面的教程都是基于创建了git用户的。而且为一个服务开一个新的用户会更加安全。

1
$ sudo useradd -m -s /usr/bin/git-shell git

这一句便创建了一个git用户,并为其创造了家目录/home/git,同时指定了/usr/bin/git-shell为shell使其除了用来进行git操作外不能进行任何事情。

但是我们还是需要一个密码来用SSH从本地连接到服务器来使用git用户的,因此设定好git用户的密码:

1
$ sudo passwd git

git要上传上来需要建立一个仓库,因此我们在git用户的家目录下创建一个仓库,这里命名为hexo.git

1
2
3
4
$ cd /home/git
$ sudo -u git mkdir hexo.git
$ cd hexo.git
$ sudo -u git git init --bare

sudo -u git表示后面的命令通过git用户执行,因为我们禁用了git用户的shell,所以需要这种方式来让git用户执行命令。

git init --bare建立一个裸git仓库。这个仓库将用来存储上传的文件和历史记录,但不能直接在其上面修改,是git远端仓库的常见创建方式。

配置Nginx

我们需要把网页存放在另一个文件夹下,供nginx访问。我们就把它放在/var/www/hexo下。同时,将其所有权改为git用户,并将权限设置为其他用户不可写。

1
2
3
$ sudo mkdir /var/www/hexo
$ sudo chmod 0755 /var/www/hexo
$ sudo chown -R git:git /var/www/hexo

向Nginx写入配置,把/var/www/hexo作为网站的根目录。

1
2
$ cd /etc/nginx/sites-available
$ sudo vim default

删除原有内容,写上:

1
2
3
4
5
6
7
8
server {
listen 80;

root /var/www/hexo;
index index.html index.htm index.nginx-debian.html;

server_name example.com; # 这里填写你服务器的域名,如果没有域名的话,就不要这行
}

至于添加HTTPS、设置反盗链什么的请自行搜索相关教程添加。

狂按Esc键,然后输入:wq退出vim,然后重启nginx服务器:

1
$ sudo systemctl restart nginx

当然现在/var/www/hexo里什么都没有……你可以先自己放个index.html到这个文件夹里测试一下自己的Nginx是否配置正确。

关联Nginx网站根目录和Git仓库

现在我们创建好了Nginx的网站根目录/var/www/hexo和Git仓库/home/git/hexo.git。现在我们要将它们两个目录关联起来:当Git仓库的内容有更新时,把更新的内容复制到网站根目录。

Git有这么一个功能,当它检测到仓库内容有更新,它就可以执行某个脚本。因此,我们将为Git仓库/home/git/hexo.git建立一个在本地推送完成后触发执行的脚本:

1
$ sudo -u git vim /home/git/hexo.git/hooks/post-update

输入:

1
2
3
#!/bin/sh

git --work-tree=/var/www/hexo --git-dir=/home/git/hexo.git checkout -f

注意,这里--work-tree后跟着网站根目录,--git-dir为Git目录。

赋予可执行权限:

1
sudo -u git chmod +x /home/git/hexo.git/hooks/post-update

到此,服务器部分配置完成。回到本地机器。

本地设置部署

安装Git部署插件

进入博客目录blog,本地执行命令:

1
2
$ cd blog
$ npm install hexo-deployer-git --save

修改配置

编辑配置文件_config.yml

1
$ vim _config.yml

找到deploy行,删除deploy部分(从deploy:行往后一直到文件末尾或者发现前面不是空格的行),然后替换成:

1
2
3
4
deploy:
type: git # 设置上传方式为Git
repo: git@example.com:hexo.git # 连接到服务器
branch: master # 推送到远端仓库的主分支

注意repo行,@前面的git为服务器的git用户,example.com请自行替换成服务器的域名或IP。

上传到服务器

运行:

1
2
3
$ hexo clean
$ hexo g
$ hexo d

输入git用户的密码,成功上传!服务器将自动把上传的内容复制到网站根目录,一个Hexo站点就搭好了!

之后在本地更新了文章后,只需要重复执行上传到服务器的操作,就可以了!