将Hexo博客部署到VPS上

之前Hexo静态博客一直托管部署在GithubPages+Vercel,倒是很稳定。但是访问速度略慢一些,于是想要转移到服务器上看看效果。

本文介绍Hexo远程部署方法、RSA免密登录方法,以及遇到的一些坑。

Hexo远程部署核心思路:本地生成静态文件 → 推送到服务器 Git 仓库 → 自动同步到 Web 目录

因此远程服务器需要两个目录:

  1. repo仓库,负责拉取更新内容并同步到web目录;
  2. web目录,并交由Nginx进行代理。

开始

第一步:安装必要软件

通过 SSH 连接到服务器,安装 Git 和 Nginx 。

1
2
3
# Ubuntu/Debian 系统
sudo apt update
sudo apt install git nginx

第二步:创建专用用户

为安全起见,建议创建一个专门用于部署的用户(如 git),而不是直接使用 root。

1
2
3
4
5
6
7
8
9
# 创建用户
sudo adduser git
# 设置密码
sudo passwd git

# 赋予 sudo 权限(可选)
sudo chmod 740 /etc/sudoers
sudo vim /etc/sudoers # 在文件中找到 root ALL=(ALL) ALL,在其下方添加一行:git ALL=(ALL) ALL,使得普通用户能通过sudo执行root权限
sudo chmod 400 /etc/sudoers

第三步:配置 SSH 免密登录

为了让本地电脑能顺利推送到服务器,需要配置 SSH 密钥认证。如果能接受每次deploy都手动输入密码,此步骤可以跳过。

  1. 在本地电脑生成 SSH 密钥对(如果还没有的话):
1
ssh-keygen -t rsa -C "your_email@example.com" # 一路回车即可

这会在 ~/.ssh/ 目录下生成 id_rsa(私钥)和 id_rsa.pub(公钥)。

将本地公钥上传到服务器的 git 用户

1
2
3
4
5
6
# 在服务器上切换为 git 用户
su - git
mkdir -p ~/.ssh
touch ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

然后,将你本地 ~/.ssh/id_rsa.pub 文件的内容,复制到服务器上 git 用户 ~/.ssh/authorized_keys 文件中。

测试免密登录
在本地终端执行:

1
ssh git@你的服务器IP

如果不需要密码就能登录到服务器,说明配置成功。输入 exit 退出。

注意,如果还需要输入密码,首先考虑.ssh、authorized_keys的权限是否配置正确。依然不行,则检查

1
2
sudo cat /etc/ssh/sshd_config | grep -i pubkey
sudo cat /etc/ssh/sshd_config | grep -i authorizedkeys

如果返回值不正确,则检查/etc/ssh/sshd_config文件

一般是**PubkeyAuthentication**被设为了false,即不接受公钥登录,改为yes即可。

第四步:在服务器上建立 Git 仓库和 Hook

这个仓库用来接收你本地 Hexo 的推送。

  1. 创建裸仓库
1
2
3
4
5
6
7
8
# 可以使用 root 或 git 用户操作
sudo mkdir -p /usr/repo
sudo chown -R git:git /usr/repo
sudo chmod -R 755 /usr/repo

cd /usr/repo
sudo git init --bare hexo-blog.git # 名称可自定
sudo chown -R git:git /usr/repo/hexo-blog.git

配置 Nginx 托管目录
这个目录是真正存放博客文件并通过Nginx代理的地方。

1
2
3
sudo mkdir -p /usr/blog/hexo
sudo chown -R git:git /usr/blog/hexo
sudo chmod -R 755 /usr/blog/hexo

配置 Git Hook
这是实现自动部署的关键。它会在接收到 push 时自动执行脚本。

1
2
# 创建或编辑钩子脚本
vim /usr/repo/hexo-blog.git/hooks/post-receive

在文件中写入以下内容:

1
2
#!/bin/bash
git --work-tree=/usr/blog/hexo --git-dir=/usr/repo/hexo-blog.git checkout -f

保存后,赋予执行权限:

1
2
sudo chmod +x /usr/repo/hexo-blog.git/hooks/post-update
sudo chown -R git:git /usr/repo/hexo-blog.git/hooks

第五步:配置 Nginx

告诉 Nginx 从哪个目录提供博客文件。

编辑 Nginx 配置文件/etc/nginx/sites-enabled/default

添加 server 块:

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 4040;
# 将 server_name 后替换为你的服务器IP或域名(如 www.yourblog.com)
server_name 127.0.0.168;

root /usr/blog/hexo; # 这就是上面创建的Web目录!
index index.html index.htm;

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

检查配置是否正确并重启 Nginx:

1
2
sudo nginx -t # 测试配置
sudo systemctl restart nginx

此时访问ip+Nginx开放端口,应该就可以看到Nginx的界面啦。

部署和测试

  1. 在本地执行部署命令

    在你的Hexo项目根目录执行:

    1
    2
    3
    hexo clean
    hexo g
    hexo deploy

    如果一切正常,命令执行后会将静态文件推送到你的服务器。

  2. 访问测试
    打开浏览器,输入你的服务器 IP 地址或域名,检查博客是否正常显示。

完事收工!