将 Hexo 部署在云服务器

前言

众所周知,使用 GitHub Page 的访问速度令人发指,当然也有很多人选择部署到 Vercel,这便是我之前的选择,免费,同时还有着更快的速度。但说到底,云服务器往往是更好的选择,只要钱到位 😑。

使用宝塔面板可以比较方便快速的进行部署,不过我更想自己实际动手操作,也一边学习 Linux,就不使用了。

准备工作

本文假设你拥有 Hexo 建站相关的知识,相关的问题不再赘述,你也可以点击这里查看 Hexo 建站相关的知识。

在阅读本文之前,你需要做好以下准备:

  1. 一台云服务器
  2. 域名以及域名解析服务

云服务器

推荐阿里云腾讯云,作为云服务的大厂还是非常靠谱的,唯一制约我们操作的就是昂贵的价格了。日常价对于学生党来说真心太贵,推荐在打折、活动时购买,很多时候首年和首月往往还是便宜的,续费就搞不起了,所以还是尽可能优惠的时候买长点吧。对个人博客而言,最基础的 1 核 2G 就足够使用了,也能让你在部署博客以外实现许多想法。

域名

你可以在阿里云腾讯云等域名供应商中购买域名,总而言之域名还是挺便宜的,一年只需要几块钱。

云服务器中的操作

以下操作以 Ubuntu 20.04 为例,其他的系统类似。

SSH 连接到云服务器

打开任意一个终端,使用 SSH 连接到云服务器

1
ssh username@你的服务器公网ip

一般用户名是 root ,之后输入密码即可。

安装 Git

1
apt-get install git

创建 Git 裸仓库

选个位置创建仓库:

1
2
3
4
5
cd /home
mkdir git
cd git
git init --bare blog.git
mkdir blog

其中,blog.git 是 git 仓库,blog 用于存放内容。

创建 Git 钩子

Git 钩子(hooks)是在 Git 仓库中特定事件(certain points)触发后被调用的脚本。通过钩子可以自定义 Git 内部的相关(如 git push)行为,在开发周期中的关键点触发自定义的行为。

我们在本地的项目文件 push 到服务器时,只是提交到了创建的 Git 服务器创建的裸仓库中。还需要进入服务器的 web 运行目录,通过 git pull 命令拉取到 web 目录。为了实现过程的自动化,可以使用 Git 中的钩子来解决该问题。

服务端钩子就是你 push 之后的事情服务器要运行的脚步,有用推的步骤只有一个,所以钩子只有四个

pre-receive 接受之前
update 更新之前
post-update 更新之后
post-receive 接受之后

/home/git/blog.git/hooks 目录下新建 post-receive

1
vim /home/git/blog.git/hooks/post-receive

写入以下文本:

1
git --work-tree=/home/git/blog --git-dir=/home/git/blog.git checkout -f

赋予执行权限:

1
chmod +x /home/git/blog.git/hooks/post-receive

配置 Nginx

1
apt-get install nginx

Nginx 安装完成之后启动调试

1
service nginx start

访问云服务器的公网 ip,查看是否有 Nginx 搭建成功的字样。

然后修改 Nginx 的配置文件:

1
2
rm -rf /etc/nginx/sites-available/default
vim /etc/nginx/sites-available/emoryhuang.cn

删除默认配置文件,并在同个目录下新建 emoryhuang.cn 写入类似如下的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
listen 80;
server_name emoryhuang.cn www.emoryhuang.cn; # 你的域名

root /home/git/blog; # 网站根目录

index index.html index.htm;

location / {
try_files $uri $uri/ =404;
}
# 你也可以根据需要配置 ssl
# listen 443 ssl;
# ssl_certificate /etc/nginx/conf/ssl/emoryhuang.cn.pem;
# ssl_certificate_key /etc/nginx/conf/ssl/emoryhuang.cn.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_protocols TLSv1.2;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
}

只有在 sites-enabled 目录下的配置文件才能够真正被访问,但是可以将文件放在 sites-available 目录下用来存档或生成链接:

1
ln -s /etc/nginx/sites-available/emoryhuang.cn /etc/nginx/sites-enabled/emoryhuang.cn

之后重新加载配置文件,启动 Nginx

1
2
3
nginx -t 	# debug
service nginx reload
service nginx restart

部署本地 hexo 到云服务器

配置 hexo 根目录的 _config.yml 文件的 deploy 选项

1
2
3
4
5
6
7
8
9
# Deployment
## Docs: https://hexo.io/docs/one-command-deployment
deploy:
- type: git
repo:
github: git@github.com:xxxxxxx/xxxxxxx.github.io.git
coding: git@e.coding.net:xxxxxxx/xxxxxxx/xxxxxxx.git
blog: 用户名@你的云服务器公网ip:/home/git/blog # add
branch: master

然后三连

1
2
3
hexo clean
hexo g
hexo d

按照提示输入密码。

之后访问你的公网 ip,就会发现你的博客已经部署上去了

域名解析

在你的域名解析服务中添加记录:

主机记录 记录类型 解析路线 记录值
@ A 默认 你的云服务器公网 ip

之后你就可以输入你的域名范访问博客。

注意:这里用云服务器的 80 端口,使用 http 访问,如果需要 https 访问,还需要 SSL 证书

由于我使用的是阿里云的服务器,因此直接使用阿里云的免费 SSL,部署起来还是很方便的。

参考资料