摘要:厌倦了 GitHub Pages 的访问速度?担心第三方平台的限制?本文将手把手教你如何像资深工程师一样,在阿里云 CentOS 上从零构建一套基于 Nginx + Git Hooks 的 Hexo 自动化部署系统。高性能、HTTPS、HTTP/2、自动化——一样都不能少。

目录

📋 架构概览

我们将构建一条高效的 CI/CD 风格发布链路。一旦你在本地执行 hexo d,服务器将自动完成代码拉取与站点更新。

git push

post-receive Hook

HTTPS/HTTP2

读取静态文件

本地电脑 (Hexo)

云服务器 (Git裸仓库)

站点目录 (/var/www/hexo)

用户浏览器

Nginx

git push

post-receive Hook

HTTPS/HTTP2

读取静态文件

本地电脑 (Hexo)

云服务器 (Git裸仓库)

站点目录 (/var/www/hexo)

用户浏览器

Nginx

🛠️ 前置准备

在开始之前,请确保你拥有:

  1. 云服务器:一台安装了 CentOS 7.x 的服务器(阿里云/腾讯云等均可)。
  2. 域名:已完成购买并备案(国内服务器必须),解析指向服务器公网 IP。
  3. 本地环境:已安装 Node.js 和 Git,且本地 Hexo 博客可正常运行。

一、 系统环境初始化

为了服务器的安全与稳定,我们首先需要更新系统内核及软件源,并安装必要的依赖。

1.1 更新系统与软件包

执行全量更新,修补安全漏洞(建议在全新的服务器上执行,以免影响现有业务)。

1
2
# 更新所有软件包及内核
sudo yum update -y

1.2 安装 EPEL 源与基础工具

EPEL (Extra Packages for Enterprise Linux) 提供了标准源中缺乏的高质量软件包(如 Certbot)。

1
2
3
4
5
# 安装 EPEL 源
sudo yum install -y epel-release

# 安装运维必备“瑞士军刀”
sudo yum install -y wget curl git vim net-tools tree policycoreutils-python

二、 编译安装高性能 Nginx

虽然 yum install nginx 很方便,但作为极客,我们推荐源码编译安装。这样可以自定义模块(如 SSL、V2、RealIP 等),并获得更高的性能掌控力。

2.1 安装编译依赖

1
sudo yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel

2.2 下载并编译 Nginx

前往 Nginx 官网 获取最新 Stable 版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 下载源码(以 1.24.0 为例,请检查官网最新版本)
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0

# ⚙️ 核心步骤:配置编译参数
# 开启 HTTPS(ssl) 和 HTTP/2(v2) 支持,指定用户为 nginx
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_gzip_static_module \
--with-http_stub_status_module

# 编译并安装
make && sudo make install

2.3 创建 Nginx 系统服务

为了方便管理,我们需要创建一个 Systemd 服务文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 创建 nginx 用户(不创建家目录,禁止登录,仅用于运行服务)
sudo useradd -s /sbin/nologin -M nginx

# 写入服务配置
sudo tee /etc/systemd/system/nginx.service << 'EOF'
[Unit]
Description=The Nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
# 启动前检查配置文件语法
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

# 重新加载配置并启动
sudo systemctl daemon-reload
sudo systemctl enable nginx
sudo systemctl start nginx

🔍 验证时刻:在浏览器输入服务器 IP。如果看到 “Welcome to nginx!” 页面,说明 Web 服务器已就绪!


nginx

三、 配置 Git 自动化部署 (核心)

这是实现“一键发布”的关键。我们将利用 Git 的 hooks 机制,在代码推送到服务器仓库时,自动将其检出到网站目录。

3.1 创建 Git 用户

为了安全,我们不使用 root 用户来同步代码,而是创建一个专门的 git 用户。

1
2
3
4
# 创建 git 用户
sudo useradd git
# 设置密码(后续配置 SSH 免密后可禁用密码登录)
sudo passwd git

3.2 赋予 Sudo 权限 (可选)

如果后续钩子脚本需要执行特殊权限命令,可以配置 sudoers,但通常部署静态文件不需要此步骤。为安全起见,建议跳过此步,仅通过文件权限控制。

3.3 建立目录结构

我们需要两个目录:

  1. 仓库目录:存放 Git 版本库历史 (.git)。
  2. 工作目录:存放 Hexo 生成的静态网页文件 (HTML/CSS/JS)。
1
2
3
4
5
6
7
8
9
10
11
12
# 1. 建立裸仓库 (Repository)
sudo mkdir -p /var/repo/hexo.git
cd /var/repo/hexo.git
sudo git init --bare

# 2. 建立网站根目录 (Web Root)
sudo mkdir -p /var/www/hexo

# 3. 统一授权:将目录所有权交给 git 用户
sudo chown -R git:git /var/repo/hexo.git
sudo chown -R git:git /var/www/hexo
sudo chmod -R 755 /var/www/hexo

3.4 编写 Automated Hook (钩子)

并在 post-receive 中编写脚本,实现代码检出。

1
2
# 编辑钩子文件
sudo vim /var/repo/hexo.git/hooks/post-receive

写入以下内容:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
# 定义 Git 仓库路径和网站根目录
GIT_REPO=/var/repo/hexo.git
WEB_ROOT=/var/www/hexo

# 将最新代码强制检出到网站目录
git --work-tree=$WEB_ROOT --git-dir=$GIT_REPO checkout -f

# 打印日志(可选,方便调试)
echo "✅ Blog Deployed successfully to $WEB_ROOT"

赋予执行权限:

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

四、 本地 Hexo 连接配置

回到你本地电脑的 Hexo 博客目录。

4.1 配置 SSH 免密登录 (强烈推荐)

如果不想每次部署都输入服务器密码,必须配置 SSH Key。

  1. 本地生成密钥 (如果没有):

    1
    ssh-keygen -t rsa -C "your_email@example.com"
  2. 上传公钥到服务器
    将本地 ~/.ssh/id_rsa.pub 的内容,追加到服务器 /home/git/.ssh/authorized_keys 文件中。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 在服务器执行:
    sudo mkdir -p /home/git/.ssh
    sudo vim /home/git/.ssh/authorized_keys
    # 粘贴公钥内容并保存

    # 修正权限(非常重要!权限不对会导致免密失败)
    sudo chown -R git:git /home/git
    sudo chmod 700 /home/git/.ssh
    sudo chmod 600 /home/git/.ssh/authorized_keys

4.2 修改 Hexo 配置

编辑本地博客根目录下的 _config.yml

1
2
3
4
5
deploy:
type: git
# 格式:git@服务器IP:仓库路径
repo: git@YOUR_SERVER_IP:/var/repo/hexo.git
branch: master

4.3 测试部署

在本地执行:

1
hexo clean && hexo g -d

如果终端显示 INFO Deploy done: git 且无需输入密码,恭喜你,自动化流程已打通!


五、 HTTPS 安全加固 (SSL)

裸奔的 HTTP 既不安全也会被浏览器标记为“不安全”。我们将使用 Let’s Encrypt 申请免费证书。

5.1 安装 Certbot

由于我们是编译安装的 Nginx,Certbot 的自动 Nginx 插件可能找不到路径。我们使用 certonly --webroot 模式,这是最稳健的方法。

1
sudo yum install -y certbot

5.2 申请证书

我们需要先临时启动 Nginx 或保证 Nginx 在运行,并确保 80 端口开放。

1
2
3
4
5
# 这里的 /usr/local/nginx/html 是 Nginx 默认的根目录,用于验证
# 也可以先在 nginx.conf 里把域名指过去,或者直接用临时目录
sudo certbot certonly --webroot -w /usr/local/nginx/html \
-d yourdomain.cn -d blog.yourdomain.cn \
--email your_email@example.com --agree-tos

注意:如果报错,请确保你的域名 DNS 已经解析到了当前服务器 IP,且防火墙(Security Group)放行了 80 端口。

成功后,证书将保存在 /etc/letsencrypt/live/yourdomain.cn/

5.3 自动续期

Let’s Encrypt 证书有效期为 90 天。添加 Crontab 任务自动续期:

1
echo "0 0 1 * * root certbot renew --quiet --deploy-hook 'systemctl reload nginx'" | sudo tee -a /etc/crontab

六、 Nginx 最终配置

修改 /usr/local/nginx/conf/nginx.conf,整合 SSL、HTTP/2 和 Gzip 压缩,指向我们 Hexo 的真实目录 /var/www/hexo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
user  nginx; # 使用我们创建的 nginx 用户
worker_processes auto;

events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;

# 🚀 开启 Gzip 压缩,大幅提升加载速度
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 5;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;

# HTTP 重定向到 HTTPS
server {
listen 80;
server_name yourdomain.cn www.yourdomain.cn;
return 301 https://$server_name$request_uri;
}

# HTTPS 服务配置
server {
listen 443 ssl http2; # 启用 HTTP/2
server_name yourdomain.cn www.yourdomain.cn;

# 证书路径
ssl_certificate /etc/xxx/fullchain.pem;
ssl_certificate_key /etc/xxx/privkey.pem;

# SSL 优化配置 (A+ 评分标准)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;

# ⚠️ 关键:根目录指向 Hexo 部署目录
root /var/www/hexo;
index index.html index.htm;

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

# 缓存静态资源 (可选)
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
}
}

应用配置:

1
2
3
4
# 检查语法
sudo /usr/local/nginx/sbin/nginx -t
# 重启服务
sudo systemctl reload nginx

七、 防火墙配置 (重要)

阿里云默认有安全组,你需要去控制台开放 80443 端口。此外,如果服务器内部启用了 firewalld,也需要放行:

1
2
3
4
5
6
7
# 查看防火墙状态
sudo systemctl status firewalld

# 如果运行中,需放行端口
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
sudo firewall-cmd --reload

🎉 结语

至此,一个高性能、自动化、安全加固的个人博客系统就搭建完成了!

现在的流程是:

  1. 写文章:hexo new "My New Post"
  2. 本地预览:hexo s
  3. 一键发布hexo d

剩下的交给 Git 和 Nginx,你只需专注于创作。🚀