Hexo部署在服务器上

网上已有非常多的Hexo部署在GitHub Page上的教程,但是由于防火墙的存在,GitHub Page的访问速度通常较慢且不稳定,而部署在自己的服务器上可以拥有更多的自主权,因此部署在服务器上依然是一个很好的选择。本文将介绍Hexo部署在服务器上的教程。

服务器+Hexo的工作流程大致如下:

  • 本地构建及推送:在本地通过Hexo引擎生成静态文件,通过Git上传至服务器
  • 服务端钩子及部署:服务端收到推送后,会自动执行post-receive钩子脚本,将网站静态文件保存至对应网站目录
  • nginx代理:nginx监听到请求后,将静态文件发送给用户,用户即可访问站点

环境

Hexo对环境似乎没有特别的要求,此处仅列举本文安装时的环境,详细的安装环境可见https://hexo.io/zh-cn/docs/

服务器环境

  • 系统:debian13.3
  • Nodejs: 20.20.0
  • npm: 11.9.0
  • git: 2.47.3
  • nginx: 1.26.3
  • hexo-cli: 4.3.2

本地环境

  • Nodejs: 24.13.1
  • npm: 11.8.0
  • Git: 2.43.0
  • hexo: 8.1.1
  • hexo-cli: 4.3.2

服务器配置

服务器端需要完成三个主要工作,分别为基础工具安装、构建自动化部署流水线以及web服务器的配置,其中基础工具安装包含了git、curl、nginx、nodejs以及Hexo的安装;构建自动化部署流水线包括了git仓库的创建,权限修改以及钩子函数的实现;web服务器的配置包括nginx的配置。

基础工具安装

  1. 安装git、curl、nginx
1
2
sudo apt update
sudo apt install git curl nginx -y
  1. 安装Nodejs

由于直接使用apt安装Nodejs存在版本陈旧的问题,因此使用添加node源的方式来安装

1
2
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs

验证安装

1
2
node -v
npm -v

如果npm版本过低,可以升级

1
sudo npm install -g npm@latest
  1. 安装Hexo CLi
1
sudo npm install -g hexo-cli

构建自动化部署流水线

在生产环境中,手动上传 HTML 文件是极其低效且易错的。专业的做法是利用 Git 的 post-receive 钩子。当本地电脑执行 hexo d 时,Git 会将变更推送到服务器,服务器自动触发钩子脚本,将生成的静态文件部署到 Web 目录。

  1. 创建目录并移交权限

我们需要以root的权限手动创建目录,并将其所有权交给当前用户并修改权限,以避免权限问题无法访问。

1
2
3
4
5
6
7
8
9
10
11
# 1. 创建网站根目录
sudo mkdir -p /var/repo/hexo_blog.git
sudo mkdir -p /var/www/hexo

# 2. 确保权限正确
sudo chown -R $USER:$USER /var/www/hexo
sudo chown -R $USER:$USER /var/repo/hexo_blog.git

# 3. 确保目录权限正确(755 也就是 rwxr-xr-x 是标准 Web 权限)
sudo chmod -R 755 /var/repo/hexo_blog.git
sudo chmod -R 755 /var/www/hexo
  1. 创建Git裸仓库

裸仓库只包含版本库信息,不包含工作区,适合作为远程仓库。

1
2
cd /var/repo/hexo_blog.git
git init --bare
  1. 创建自动化钩子(Git Hook)

我们需要创建一个脚本,当推送代码时,该脚本回自动运行,把代码部署到网站目录。

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

写入以下shell脚本,该脚本会自动将git仓库的内容checkout到/var/www/hexo目录中

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

赋予权限

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

配置web服务器

单纯生成文件无法对外服务,需要配置 Nginx 作为反向代理或静态文件服务器。

  1. 创建nginx配置文件
1
sudo vim /etc/nginx/sites-available/hexo

将下述内容写入对应的文件,其中you_domain.com为实际访问网站的域名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 80;
server_name your_domain.com;

root /var/www/hexo; # 必须与 Git 钩子中的 work-tree 一致
index index.html index.htm;

location / {
try_files $uri $uri/ =404;
}

# 开启 gzip 压缩以优化加载速度(推荐)
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}
  1. 激活配置并重启服务
1
2
3
sudo ln -s /etc/nginx/sites-available/hexo /etc/nginx/sites-enabled/
sudo nginx -t # 检查配置语法是否正确
sudo systemctl restart nginx

本地Hexo配置对接

本地需要部署hexo引擎,用于将本地的文件编译成静态网站文件

环境安装

  1. 安装Nodejs

安装地址:https://nodejs.org/

  1. 安装Git部署插件
1
npm install hexo-deployer-git --save

配置修改

  1. 部署Hexo

进入网站目录,执行下述指令

1
2
hexo init .
npm install
  1. 修改_config.yml

主要修改deploy部分即可,其中type要选择git;repo为服务端的git地址,其中username为服务器用户名,ip为服务器ip;branch要和服务器初始化的分支名一致。

1
2
3
4
deploy:
type: git
repo: <username>@<ip>:/var/repo/hexo_blog.git
branch: main # 必须与服务器初始化的分支名一致
  1. 执行部署

在执行完部署后,Hexo会将静态资源推送到服务器的Git仓库,随后服务器的钩子函数会自动将文件解压到/var/www/hexo,我们就可以通过nginx访问到博客了。

1
2
3
4
hexo cl # hexo clean,清理生成的文件
hexo g # hexo generate,生成静态文件
hexo d # hexo deploy,推送
hexo s # hexo server,用于调试