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

目录

  1. 📋 架构概览
  2. 🛠️ 前置准备
  3. 一、 系统环境初始化
    1. 1.1 更新系统与软件包
    2. 1.2 安装 EPEL 源与基础工具
  4. 二、 编译安装高性能 Nginx
    1. 2.1 安装编译依赖
    2. 2.2 下载并编译 Nginx
    3. 2.3 创建 Nginx 系统服务
  5. 三、 配置 Git 自动化部署 (核心)
    1. 3.1 创建 Git 用户
    2. 3.2 赋予 Sudo 权限 (可选)
    3. 3.3 建立目录结构
    4. 3.4 编写 Automated Hook (钩子)
  6. 四、 本地 Hexo 连接配置
    1. 4.1 配置 SSH 免密登录 (强烈推荐)
    2. 4.2 修改 Hexo 配置
    3. 4.3 测试部署
  7. 五、 HTTPS 安全加固 (SSL)
    1. 5.1 安装 Certbot
    2. 5.2 申请证书
    3. 5.3 自动续期
  8. 六、 Nginx 最终配置
  9. 七、 防火墙配置 (重要)
  10. 🎉 结语

📋 架构概览

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

1
2
3
4
5
graph LR
A[本地电脑 (Hexo)] -- git push --> B[云服务器 (Git裸仓库)]
B -- post-receive Hook --> C[站点目录 (/var/www/hexo)]
D[用户浏览器] -- HTTPS/HTTP2 --> E[Nginx]
E -- 读取静态文件 --> C

🛠️ 前置准备

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

  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,你只需专注于创作。🚀