超详细版:从 0 到 1 把 Hexo 静态博客部署到阿里云服务器

(含所有错误排查、保存退出、钩子脚本细节)


0 前提

  • 阿里云 ECS 或轻量服务器(系统以 Ubuntu 为例,CentOS 同理)
  • 本地电脑已安装 Hexo、Git、Node.js
  • 服务器已开放 22、80、443 端口(安全组+系统防火墙)

1 服务器端操作(全程 root 身份)

1.1 安装基础环境

1
2
3
4
5
# 更新软件源
sudo apt update && sudo apt upgrade -y

# 安装 Git + Nginx + Node/npm
sudo apt install -y git nginx nodejs npm

1.2 创建裸仓库(只存 Git 历史)

1
2
3
4
5
6
# 创建目录
sudo mkdir -p /var/repo/blog.git
cd /var/repo/blog.git

# 初始化裸仓库(--bare = 无工作区)
sudo git init --bare

1.3 创建网站目录

1
sudo mkdir -p /var/www/hexo

1.4 创建 Git Hook(自动部署脚本)

1
2
# 用 vim 打开钩子文件(如用 nano,见下方保存退出)
sudo vim /var/repo/blog.git/hooks/post-receive

在 vim 里,按 i 进入插入模式,完整粘贴以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
# 变量——如需修改,只改这里
GIT_REPO=/var/repo/blog.git
TMP_CLONE=/tmp/hexo-$(date +%s)
PUBLIC_WWW=/var/www/hexo

# 克隆最新代码
git clone $GIT_REPO $TMP_CLONE

# 清空旧文件并复制新文件
rm -rf $PUBLIC_WWW/*
cp -rf $TMP_CLONE/* $PUBLIC_WWW/

# 清理临时目录
rm -rf $TMP_CLONE

保存并退出 vim

  1. Esc 回到命令模式
  2. 输入 :wq! 回车(w=写入,q=退出,!=强制)

给脚本可执行权限:

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

2 配置 Nginx 指向网站根目录

2.1 备份默认配置

1
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak

2.2 修改 Nginx 配置

1
sudo vim /etc/nginx/sites-available/default

找到:

1
root /var/www/html;

改成:

1
root /var/www/hexo;

整段最小可用配置如下(可替换整段):

1
2
3
4
5
6
7
8
9
10
11
server {
listen 80;
listen [::]:80;
server_name 120.26.144.211; # 以后换成域名
root /var/www/hexo;
index index.html index.htm;

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

保存退出 vimEsc:wq! → 回车

2.3 测试并重载

1
2
sudo nginx -t           # 语法检查
sudo systemctl reload nginx

3 本地 Hexo 配置一键推送

3.1 安装 hexo-deployer-git

1
npm install hexo-deployer-git --save

3.2 _config.yml 尾部追加

1
2
3
4
deploy:
type: git
repo: root@120.26.144.211:/var/repo/blog.git
branch: main # 与裸仓库分支保持一致

3.3 首次推送并测试

1
hexo clean && hexo g -d

看到:

1
INFO  Deploy done: git

即成功。


4 常见错误一览 & 解决

现象 原因 解决命令
Permission denied 目录/文件权限不足 sudo chown -R www-data:www-data /var/www/hexo
sudo chmod -R 755 /var/www/hexo
nginx: [emerg] bind() to 0.0.0.0:80 failed 80 端口被占用 sudo lsof -i:80
sudo systemctl stop apache2 或其他进程
上传后目录为空 钩子默认分支是 master,推送的是 main 在裸仓库执行:git symbolic-ref HEAD refs/heads/main
样式错乱/空白 图片/Css 404、路径错误 _config.ymlurl 改为 http://120.26.144.211 再重新部署
vim 提示 E45: readonly 没权限 sudo vim:wq! 强制保存
每次输入密码 未配置 SSH 密钥 ssh-copy-id root@120.26.144.211

5 一键速查表

任务 命令
本地预览 hexo s -o
正式发布 hexo clean && hexo g -d
重启 nginx sudo systemctl restart nginx
查看 nginx 错误日志 sudo tail -f /var/log/nginx/error.log

6 下一步:域名 + HTTPS

  1. 阿里云购买域名 → 域名控制台解析 → A 记录指向 120.26.144.211
  2. 备案 → 免费申请 SSL → 改 Nginx server_name → 启用 443 端口 → 全站 HTTPS

至此,完全自主、无第三方平台 的 Hexo 部署流程结束。祝你顺利!