前言

2022年腾讯云搞活动买了五年的服务器,才300多。hexo一直部署在服务器上,比在github或vercel上要快不少。最近想用服务器部署一个项目,用到了node18,发现服务器系统还是centos7,在2024年中旬就不再维护了。服务器上除了博客和大学做的一些垃圾也没什么重要的东西,所以今天直接重装了系统,导致博客打不开,晚上又重新部署了下博客。

上一次部署的时候就没有留痕,这次部署也遇到些问题,所以打算写一篇博客记录一下。


一、 环境准备:安装核心依赖

首先,我们需要安装 Node.js、Git、Nginx 以及用于自动化配置 HTTPS 的 Certbot。以 Ubuntu/Debian 系系统为例:

1
2
3
4
5
6
# 添加 Node.js 18 运行源
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -

# 更新并安装依赖
sudo apt update
sudo apt install -y nodejs git nginx certbot python3-certbot-nginx

为什么用 Certbot?

以往配置 HTTPS 需要手动生成 CSR、上传验证文件、修改 Nginx 配置,流程极其繁琐。现在只需一行命令,Certbot 就能自动完成证书申请和 Nginx 配置,简直是运维神器。


二、 配置 Nginx:让站点可访问

我们需要为博客创建一个 Nginx 配置文件。

  1. 创建配置文件:sudo vim /etc/nginx/sites-available/yourdomain
  2. 写入基础配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 80;
server_name example.com www.example.com; # 替换为你的域名

root /var/www/hexo; # 博客文件存放目录
index index.html;

location / {
try_files $uri $uri/ /index.html;
}

access_log /var/log/nginx/hexo.access.log;
error_log /var/log/nginx/hexo.error.log;
}
  1. 激活配置:
1
2
3
4
5
6
# 创建软链接以激活站点
sudo ln -s /etc/nginx/sites-available/yourdomain /etc/nginx/sites-enabled/

# 测试配置并重启 Nginx
sudo nginx -t
sudo systemctl reload nginx

小技巧: 使用 sites-availablesites-enabled 的模式是为了方便管理。如果你想临时下线某个站点,只需删除 sites-enabled 里的快捷方式(软链接)即可,源文件依然保留。

三、 开启 HTTPS:安全加固

在域名解析生效后,执行以下操作,Certbot 会自动修改 Nginx 配置并加入 SSL 支持:

1
2
3
4
sudo certbot --nginx -d example.com -d www.example.com

# 测试自动续期(模拟执行)
sudo certbot renew --dry-run

四、 自动化部署:Git Hooks 方案

为了实现本地执行 hexo d 就能自动更新服务器文件,我们需要在服务器上配置一个 Git 仓库作为“中转站”。

1. 安全起见:创建专用 git 用户

为了避免直接使用 root 账户带来的安全隐患,我们创建一个名为 git 的用户。

1
2
sudo useradd -m git
sudo passwd git # 设置密码

2. 配置 SSH 免密登录(可选但推荐)

在本地终端(如 Git Bash)生成秘钥对并将其公钥上传至服务器,后续部署无需反复输入密码。

  • 本地操作:在本地计算机上打开Git Bush执行命令: ssh-keygen -t rsa,生成密钥对。运行完后可在C:\Users\用户名.ssh文件下找到id_rsaid_rsa.pub文件,前者为私钥文件,后者为公钥文件
  • 服务器操作:
    在服务器终端先执行makdir -p /home/git/.ssh,后执行cd /home/git/.ssh以及nano authorized_keys,输入本地id_rsa.pub文件内容。粘入公钥内容后按:Ctrl+O (写出 write-out),回车确认文件名(默认显示 authorized_keys),然后按 Ctrl+X 退出 nano。
1
2
3
4
5
6
su - git
makdir -p /home/git/.ssh
cd /home/git/.ssh
nano authorized_keys # 粘贴本地公钥
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

3. 创建 Git 裸库与钩子

裸库(Bare Repository) 不包含工作区,仅用于存储版本历史,是实现自动部署的核心。

1
2
3
cd /home/git
git init --bare blog.git
chown -R git:git blog.git

接着,编辑钩子文件(post-receive),当有新代码 push 进来时,自动将其检出到 Web 目录:

  1. 新建文件: nano /home/git/blog.git/hooks/post-receive
  2. 写入以下脚本:
1
2
3
4
#!/bin/bash
# --work-tree 对应 Nginx 配置中的 root 目录
# --git-dir 对应 Git 仓库目录
git --work-tree=/var/www/hexo --git-dir=/home/git/blog.git checkout -f
  1. 赋予执行权限并调整目录所有权:
1
2
3
chmod +x /home/git/blog.git/hooks/post-receive
# 确保 git 用户对 Web 目录有写入权限
sudo chown -R git:git /var/www/hexo

五、 本地配置:一键发布

最后一步,修改本地 Hexo 根目录下的 _config.yml 文件:

1
2
3
4
deploy:
type: git
repository: git@你的服务器IP:/home/git/blog.git
branch: master

发布流程:

1
2
3
hexo clean
hexo g
hexo d

至此可以在浏览器中输入域名来访问博客站点了。