Hexo博客能通过对markdown文档进行解析,输出静态html网页,易被部署至github,但github服务器在国外,国内访问速度很慢,因此部署在云上,也易于维护

准备工作

  • 一台云服务器
  • 本地搭建好的hexo blog
  • 一个备案好的域名(没有就用ip访问)

云服务器配置

创建git用户

1
2
sudo adduser git
# 输入密码

给git用户增加权限(这里可以尝试不加权限试一下,笔者是加了的)

1
2
3
4
5
6
7
sudo chmod 740 /etc/sudoers

sudo vim /etc/sudoers
# 找到合适的位置添加如下
git ALL=(ALL:ALL) NOPASSWD:ALL

sudo chmod 400 /etc/sudoers

配置ssh key

1
2
3
4
su git
mkdir ~/.ssh && chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys
# 将本地生成的公钥内容复制到authorized_keys中并保存,可以实现免密登录,具体可以参见[博客]()

创建一个名为blog的git仓库

1
2
3
4
5
6
su $USER  # 切换回原来的账户

mkdir /var/repo
cd /var/repo
sudo chown git -R /var/repo # 需要更改repo权限为git所有
git init --bare blog.git

git用户可以通过ssh连接,进行任何操作。为了安全性,将git用户的活动限制在与Git相关范围,即把git用户的shell改成 git-shell

1
sudo chsh git -s $(which git-shell)

配置钩子 GIT HOOKS

1
vim /var/repo/blog.git/hooks/post-receive

添加如下:

1
2
#!/bin/sh
git --work-tree=/var/www/hexo --git-dir=/var/repo/blog.git checkout -f

然后保存退出,并设置权限

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

改变 blog.git 目录的拥有者为 git 用户

1
sudo chown -R git:git blog.git

创建静态文件目录且与钩子路径相对应

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

测试是否成功,打开本地终端输入:

1
git clone git@云服务器ip:/var/repo/blog.git

当你看到如下,就说明前边已经部署好了

1
2
Cloning into 'blog'...
warning: You appear to have cloned an empty repository.

本地hexo配置

打开hexo博客根目录,编辑_config.yml文件
修改repository为:

1
2
3
4
deploy:
type: git
repository: git@云服务器ip或域名:/var/repo/blog.git
branch: master

然后hexo clean && hexo g && hexo d推送到云服务器

云服务器nginx配置

1
2
3
vim /etc/nginx/sites-available/default
# 添加如下:
include sites-available/single/*.conf

/etc/nginx/sites-available/single/下新建一个blog.conf,编辑添加如下内容,并将其中的 ROOT 指令指向 /var/www/hexo 目录(也就是GIT钩子目录)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 80;
server_name blog.codejerry.cn;
root /var/www/hexo;
}

server {
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/codejerry.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/codejerry.cn/privkey.pem;

server_name blog.codejerry.cn;
root /var/www/hexo;
}

最后重启服务,让NGINX生效

1
2
sudo nginx -t
sudo nginx -s reload