前言

看了很多有关于搭建 hexo 博客的博文,也想自己搭建一个 hexo 博客,最近疫情从隔离酒店回家,闲的时间多出来,正好准备完成这个工作。本以为是一件很简单的工作,没想到从了解怎么做,到开始尝试最后完工,最后花了 1 个星期(每天搞一点),反省下来,觉得耗时最多的几个地方,我把它们列在下面:

  • 面对众多选择的犹豫,希望找到最优解决方案入手
  • 处理在浏览器解决问题时,先学后忘,又找不到原来的标签页在哪里
  • 对于 linux 知识的不熟悉(尤其是权限问题)

自我反思之后,我将把这些问题的解决方法和最终我的搭建经历都写在这篇博文中。

方法选择

我最终选择了 Hexo + 服务器 ** 的方式部署我的博文,同时选择使用 ** 服务器端 git hook 上传我在本地写作的文件,并部署。其实一开始我并不是选择这个办法,但是在进行多方考虑以后,我最终选定了这个方法。

首先我们要明白这样一套工作流程的目的。我所希望的理想写作模式,是 ** 在本地写作完成后,以尽量少的步骤将我的博客发表,并且在公网可见。** 根据这两点需求,可以产生许多不同的解决方式的组合。

我在下面简单列出一些网上流行的解决博客部署的方法。

  1. Hexo + Github
  2. Hexo + Github Actions + nginx
  3. Hexo + 服务器 git hook + nginx

我选择了第三种。
需要在公网可见,可以选择的方法有:服务器和 Github Pages。我选择服务器,一是想锻炼一下自己的 linux 能力,还有就是 Github Pages 在国内不能不能被轻松访问到。(这么方便的 github pages, 不如留给更 temperate 的需求去使用)

既然选择了自己的服务器部署,那么就需要选择对应的(当然可能更加复杂)部署方式

完成自动部署的核心在于,我利用 hexo 自带的 deploy 工具,需要将我生成的页面,** 送到服务器 Nginx 托管的目录下 **。 也就是说,我想要把本地 hexo deploy 的一些文件传到服务器下,同时受到 Nginx 的托管。

完成这个的方法有两个:

  • Github Actions
  • Git hooks

他们的共同点是都通过 hexo 自带的 git-deployer 模块实现部署到一个 git 仓库,再将内容复制到服务器指定文件夹下

为什么不直接将整个 hexo 项目文件夹传到服务器中呢?
因为这样很 low, 而且很有可能存在系统兼容的问题

使用 Github Actions 的做法可以概括为:我提交 hexo deploy 的文件到 github 仓库中,然后自动触发对应的 Actions,让这个 Action 把我的文件 clone 到服务器上的 Nginx 托管目录。

这样的操作是可行的,而且速度不慢。但是网上有人提到这样会每次将 hexo 的文件提交时间更改,见这篇博文 。文中作者还给出了解决办法,但我本身并没有实测,而是使用另一个方法,就是 git hook

这里记录我一个有意思的理解误区,曾经我一直一位 Github 是 git 唯一的使用地方。但是直到这次的实践,我才知道git可以用在很多不同地方,比如服务器。git的本质是版本管理工具,其中也包括了远程仓库。我们使用的Github就是远程仓库的一种,git hook其实是远程仓库中的一个特性,只不过这次我们远程仓库的位置就是我们的云服务器。

博客搭建

我们首先完成服务器 ssh 登录的设置。不过看了大多数人的教程,没有人把我们为什么这么做讲的清楚明白,授人以鱼不如授人以渔,我觉得可以提出一些我自己的心得体会。

ssh 登录依靠的是服务器知道你电脑的公钥,建立连接,然后通过只有你自己知道的私钥,加密数据。因此注意 ** 不是为每一个服务器生成一个公钥,而是只要给自己电脑生成过一个公钥和私钥,然后把公钥放到任何你需要 ssh 登录的地方 **。这部分的具体步骤可以看 这篇博文。这个问题的方法网上都有,我觉得记录一下自己的心得就足够了。

完成登录以后,我们开始配置 git hook。

Git hook 配置

首先我们确保自己在平时使用的用户名下,我使用的是 ubuntu 用户,没有 root 权限。
用户名这个问题,真是让我吃尽力苦头。。。

假设已经安装过了 git 后, 我们在任何地方新建一个 git 仓库。
sudo mkdir -r /www/repo/blog.git
** 注意:如果是使用 sudo 命令创建的命令,其权限是 root,需要设置所有人,所有组为你自己(因为之后在本地上传的时候的用户名就是自己的用户名,权限如果是 root 将报错)**
权限修改:
chown ubuntu:ubuntu -R /www
chown ubuntu:ubuntu -R /www/repo
chown ubuntu:ubuntu -R /www/repo/blog.git
再创建一个 nginx 代理的文件夹:
sudo mkdir -r /www/hexo
同样修改权限,方法如上
然后进入仓库并初始化:

1
2
cd /www/repo
git init --bare blog.git

接着,进入 blog.git/hooks/,创建 git 钩子
vim post-receive
在里面添加:
git --work-tree=/www/repo/blog.git --git-dir=/www/hexo checkout -f
vim 操作方法这里跳过
保存退出后,赋予之可执行文件的权限,以及查看所有组,所有人

1
2
3
chmod +x ~/blog.git/hooks/post-receive
chown ubuntu:ubuntu post-receive
chmod 777 post-receive

如果是 sudo vim 编辑的,需要额外调整 chmod,使读写权限放开(如上)

Nginx 配置

安装 Nginx 之后,我们进入 /etc/nginx 的目录,这里普及一下 nginx 配置的原理
nginx 通过虚拟出多个 server,实现为该主机部署多个站点的可能。而一个 server 处理某个 ip 地址中收到的 80/433 端口接受的请求,转发给下方多个接受的 url handler(nginx 中是 location)
我们在 sites-enabled 中修改 default 文件,在 server 中修改 nginx 处理的文件路径

1
2
3
4
5
6
7
server {
server_name 127.0.0.1;
location / {
root /www/hexo; #nginx 代理的目录
index.html index.htm;
}
}

sites-enabled 中的文件,会在主配置文件 nginx.conf 中引入
这里注意一下 nginx.conf 中第一行的 user,为了保证权限足够,可以直接改成 user root;

可以切换到 root 用户测试一下 nginx 的配置正确情况

切换 root 用户的方法:
如果没有创建过 root 用户,执行以下命令

passwd root
1
#设置密码,确认密码...

接着切换用户:(已经创建的可直接跳到这一步)

1
2
su root
#输入密码

su username 是切换用户的通用方法

然后重启 nginx,并测试 nginx 配置:(root 用户下)

1
2
3
4
5
nginx -s reload

nginx -t

systectl status nginx

如果都是没有报错的输出,那么就没有问题了(这里写的简略了,

本地 hexo 配置

我们修改 hexo 本地目录下的 _config.yml
将 deploy 改成:

1
2
3
4
5
deployer:
type: git
branch: master
repo: username@ip:{path}
#我这里是 ubuntu@1.15.133.252:/www/repo/blog.git

目前我们配置好了大部分内容,但是博客中忽略了大部分的安装过程以及测试内容。今天先写道这里,连着写有点累,择日再补充完整的吧。