🚀 全栈进阶:阿里云 CentOS 7 搭建 Hexo 自动化部署博客
摘要:厌倦了 GitHub Pages 的访问速度?担心第三方平台的限制?本文将手把手教你如何像资深工程师一样,在阿里云 CentOS 上从零构建一套基于 Nginx + Git Hooks 的 Hexo 自动化部署系统。高性能、HTTPS、HTTP/2、自动化——一样都不能少。
目录
- 📋 架构概览
- 🛠️ 前置准备
- 一、 系统环境初始化
- 二、 编译安装高性能 Nginx
- 三、 配置 Git 自动化部署 (核心)
- 四、 本地 Hexo 连接配置
- 五、 HTTPS 安全加固 (SSL)
- 六、 Nginx 最终配置
- 七、 防火墙配置 (重要)
- 🎉 结语
📋 架构概览
我们将构建一条高效的 CI/CD 风格发布链路。一旦你在本地执行 hexo d,服务器将自动完成代码拉取与站点更新。
1 | graph LR |
🛠️ 前置准备
在开始之前,请确保你拥有:
- 云服务器:一台安装了 CentOS 7.x 的服务器(阿里云/腾讯云等均可)。
- 域名:已完成购买并备案(国内服务器必须),解析指向服务器公网 IP。
- 本地环境:已安装 Node.js 和 Git,且本地 Hexo 博客可正常运行。
一、 系统环境初始化
为了服务器的安全与稳定,我们首先需要更新系统内核及软件源,并安装必要的依赖。
1.1 更新系统与软件包
执行全量更新,修补安全漏洞(建议在全新的服务器上执行,以免影响现有业务)。
1 | # 更新所有软件包及内核 |
1.2 安装 EPEL 源与基础工具
EPEL (Extra Packages for Enterprise Linux) 提供了标准源中缺乏的高质量软件包(如 Certbot)。
1 | # 安装 EPEL 源 |
二、 编译安装高性能 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 | # 下载源码(以 1.24.0 为例,请检查官网最新版本) |
2.3 创建 Nginx 系统服务
为了方便管理,我们需要创建一个 Systemd 服务文件。
1 | # 创建 nginx 用户(不创建家目录,禁止登录,仅用于运行服务) |
🔍 验证时刻:在浏览器输入服务器 IP。如果看到 “Welcome to nginx!” 页面,说明 Web 服务器已就绪!
三、 配置 Git 自动化部署 (核心)
这是实现“一键发布”的关键。我们将利用 Git 的 hooks 机制,在代码推送到服务器仓库时,自动将其检出到网站目录。
3.1 创建 Git 用户
为了安全,我们不使用 root 用户来同步代码,而是创建一个专门的 git 用户。
1 | # 创建 git 用户 |
3.2 赋予 Sudo 权限 (可选)
如果后续钩子脚本需要执行特殊权限命令,可以配置 sudoers,但通常部署静态文件不需要此步骤。为安全起见,建议跳过此步,仅通过文件权限控制。
3.3 建立目录结构
我们需要两个目录:
- 仓库目录:存放 Git 版本库历史 (
.git)。 - 工作目录:存放 Hexo 生成的静态网页文件 (HTML/CSS/JS)。
1 | # 1. 建立裸仓库 (Repository) |
3.4 编写 Automated Hook (钩子)
并在 post-receive 中编写脚本,实现代码检出。
1 | # 编辑钩子文件 |
写入以下内容:
1 |
|
赋予执行权限:
1 | sudo chmod +x /var/repo/hexo.git/hooks/post-receive |
四、 本地 Hexo 连接配置
回到你本地电脑的 Hexo 博客目录。
4.1 配置 SSH 免密登录 (强烈推荐)
如果不想每次部署都输入服务器密码,必须配置 SSH Key。
本地生成密钥 (如果没有):
1
ssh-keygen -t rsa -C "your_email@example.com"
上传公钥到服务器:
将本地~/.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 | deploy: |
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 | # 这里的 /usr/local/nginx/html 是 Nginx 默认的根目录,用于验证 |
注意:如果报错,请确保你的域名 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 | user nginx; # 使用我们创建的 nginx 用户 |
应用配置:
1 | # 检查语法 |
七、 防火墙配置 (重要)
阿里云默认有安全组,你需要去控制台开放 80 和 443 端口。此外,如果服务器内部启用了 firewalld,也需要放行:
1 | # 查看防火墙状态 |
🎉 结语
至此,一个高性能、自动化、安全加固的个人博客系统就搭建完成了!
现在的流程是:
- 写文章:
hexo new "My New Post" - 本地预览:
hexo s - 一键发布:
hexo d
剩下的交给 Git 和 Nginx,你只需专注于创作。🚀