一. 开篇词

1.1 前言

  • 官方文档介绍了 Hexo 可以同时一键部署到多个平台,只需要同时使用多个 deployer

中文官方文档

Hexo 提供了快速方便的一键部署功能,让您只需一条命令就能将网站部署到服务器上。

1
$ hexo deploy

在开始之前,您必须先在 _config.yml 中修改参数,一个正确的部署配置中至少要有 type 参数,例如:

1
2
deploy:
type: git

您可同时使用多个 deployer,Hexo 会依照顺序执行每个 deployer。

1
2
3
4
5
deploy:
- type: git
repo:
- type: heroku
repo:

1.2. 说明

  • 使用 Git Hooks 同步 Hexo 生成的静态文件。(后期我弃用 git,改用 rsync 了)

二. 步骤

2.1 云服务器创建 Git 仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ cd /opt/git/

$ git init --bare hexo.git # 创建 Hexo 远程仓库 git init --bare 仓库名.git

$ cd /opt/git/hexo.git/hooks/

$ vim post-receive
#!/bin/bash
git --work-tree=/opt/www/hexo --git-dir=/opt/git/hexo.git checkout -f

# --work-tree=/opt/www/hexo 设置工作树的路径
# --git-dir=/opt/git/hexo.git 设置存储库的路径

$ chmod +x post-receive # 给钩子文件添加执行权限

$ mkdir /opt/www/hexo # 创建工作树路径

$ chmod -R 777 /opt/www/hexo # 授权,否则到后面访问报 403

2.1.2 deployer 使用 rsync 进行部署

前言:后面发现使用 git 上传至云服务器速度太慢了(不清楚啥原因),改用 rsync。

git 上传速度如下图

  1. 使 git bash 支持 rsync(Windows)

    参考
    https://blog.csdn.net/m0_48613893/article/details/124104757
    https://blog.csdn.net/qq_38689395/article/details/125758842
    如果文件重复,就跳过
    如果出错就修改文件名 .\usr\bin\msys-xxhash-0.8.0.dll → msys-xxhash-0.dll

  2. ./_config.yml 文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    deploy:
    - type: rsync
    host: IP地址
    user: 使用者名称
    root: 远程主机的根目录
    port: 22
    delete: true
    verbose: true
    ignore_errors: false

    参考 https://hexo.io/zh-cn/docs/one-command-deployment#Rsync

在传大文件(也就10M)时依旧很慢,但比前者速度快些。

2.2 配置本地Hexo _config.yml

  • ./_config.yml 文件,同步部署 GitHub、Gitee、云服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Deployment - 部署
## Docs: https://hexo.io/zh-cn/docs/one-command-deployment.html
deploy:
- type: git
repository: root@IP地址:/opt/git/hexo.git
branch: master
commit: Site updated
message: hexo {{ now('YYYYMMDD') }}
- type: git
repository: git@github.com:mycpen/mycpen.github.io.git
branch: main
commit: Site updated
message: hexo {{ now('YYYYMMDD') }} # message为自定义提交信息,默认为 Site updated: YYYY-MM-DD HH:mm:ss
- type: git
repository: git@gitee.com:mycpen/mycpen.gitee.io.git
branch: master
commit: Site updated
message: hexo {{ now('YYYYMMDD') }}

2.3 配置 SSH 免密登录

  • 本地 SSH 公钥 如~/.ssh/id_rsa.pub 内容添加至云服务器 ~/.ssh/authorized_keys

2.4 部署

  • 本地 Hexo 源文件项目下敲

1
hexo clean ; hexo g ; hexo d

2.5 使用 NGINX 做 Web 服务器

  • 新增虚拟主机配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ cat /usr/local/nginx/conf/conf.d/blog.cpen.top.conf
server {
listen 80;
listen 443 ssl;

server_name blog.cpen.top;

error_page 404 /404.html;

# 强制HTTPS跳转
if ($scheme = "http") {
return 307 https://$host$request_uri;
}

root /opt/www/hexo;

ssl_certificate /usr/local/nginx/ssl/blog.cpen.top.pem;
ssl_certificate_key /usr/local/nginx/ssl/blog.cpen.top.key;

access_log /data/service_logs/nginx/blog.cpen.top_access.log misc;
error_log /data/service_logs/nginx/blog.cpen.top_error.log;
}

三. 注意点

  1. 配置 SSH 免密

  2. 存储目录授权

    给工作树路径 /opt/www/hexo 777 权限,~~一开始没授权 访问报 403,环境为 CentOS 8.2;~~原因找到了,第 5 点。

  3. 开放端口。注意是否需要在云服务器新增安全组策略,80、443 端口需要打开;

  4. SELinux 等原因。

  5. 403 权限问题
    后面查询发现了 403 的原因,Nginx 编译安装时我指定了启动用户为 普通用户(默认为 nobody),导致起的工作进程权限不够。而 Hexo 上传的新的静态文件权限不为 777。

    所以修改 Nginx 的启动用户为 root。

    1
    2
    3
    4
    $ vim /usr/local/nginx/conf/nginx.conf
    user root;

    $ nginx -s reload

四. 参考文章

官方文档 一键部署

* 使用 Git Hooks 部署至云服务器

使用 Git Hooks 部署至云服务器

使用 Git Hooks 部署至云服务器 新增 git 用户、授权目录

* 访问403 修改 Nginx 启动用户为 root

* 访问403 授权 777 目录

访问 403 CentOS 8 环境

访问 403 SELinux 未关闭