Hexo 静态博客建站实战:从环境搭建、Markdown 写作到 Git 钩子与 Nginx 部署全流程

为什么个人站长还在用 Hexo:静态博客到底省了什么

做个人站长这些年,我见过太多人一开始就上 WordPress、Typecho,结果半年后卡在「服务器跑得动跑不动」「被扫之后要不要打补丁」「数据库要不要备份」这些运维问题上。如果你的博客主要是发文章、放教程、写随笔,没有会员系统、没有电商、没有复杂的评论审核需求,那么静态博客是性价比极高的一条路。Hexo 就是这条路最成熟的工具之一。

静态博客的核心优势只有一句话:它没有后端。访问者打开的是一个事先生成好的 .html 文件,Nginx 直接把它读出来返回,不需要 PHP 进程,不需要连数据库,不需要在每次请求时去查表、渲染模板。这带来三个直接结果:

第一,速度极快。一个纯静态页面的响应时间通常是几毫秒,而动态博客光是 PHP 启动加一次数据库查询就可能花掉几十到几百毫秒。第二,安全面极小。没有 PHP、没有数据库,SQL 注入、文件上传漏洞、插件后门这些常见攻击面直接消失,剩下的主要就是 Nginx 和系统的安全配置。第三,资源占用低。一台 1 核 1G 的入门 VPS 就能轻松扛住日常访问和搜索引擎爬虫,不用为了「PHP 跑不动」去升级配置。

环境准备:Node.js 与 npm 的正确装法

Hexo 是基于 Node.js 的静态站点生成器,所以第一件事是装 Node.js。系统自带的 apt 源里 Node 版本往往偏旧,而 Hexo 6 及以上对 Node 版本有要求(建议 Node 18 LTS 或 20 LTS)。推荐用 NodeSource 官方源安装:

# 以 Node 20 LTS 为例(Debian/Ubuntu)
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt-get install -y nodejs

# 验证
node -v
npm -v

如果你习惯用 nvm 管理多版本 Node,也可以:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install 20
nvm use 20

装完 Node 后,安装 Hexo 命令行工具。这里有个坑:很多人直接 npm install -g hexo,但新版 Hexo 的脚手架包已经改名为 hexo-cli:

npm install -g hexo-cli
hexo -v

如果 npm 全局安装很慢,先换国内镜像:

npm config set registry https://registry.npmmirror.com

初始化站点:目录结构一次说清

在你想放博客的目录下执行:

hexo init myblog
cd myblog
npm install

初始化完成后你会看到这样的目录结构,每个目录的含义必须搞清楚,否则后面改配置会很懵:

myblog/
├── _config.yml        # 站点主配置(标题、URL、部署方式)
├── package.json       # 依赖清单
├── scaffolds/         # 新建文章的模板(post/page/draft)
├── source/            # 内容源目录
│   ├── _posts/        # 你写的 Markdown 文章都放这里
│   └── _drafts/       # 草稿
├── themes/            # 主题目录
└── public/            # 生成后的静态文件(hexo generate 的产物)

关键点:你平时只需要动 source/_posts 和 _config.yml,public 是自动生成的,不要手改,它每次 generate 都会被覆盖。

写好第一篇 Markdown 文章

新建文章用:

hexo new "我的第一篇Hexo博客"

它会在 source/_posts/ 下生成一个 .md 文件,顶部带 Front-matter:

---
title: 我的第一篇Hexo博客
date: 2026-10-07 10:00:00
tags:
  - 建站
  - Hexo
categories:
  - 技术教程
---
这里开始写正文,用 Markdown 语法即可。

Front-matter 里的 date 决定文章排序和 URL,tags 和 categories 决定分类归档页。写完正文后,本地预览:

hexo server
# 默认监听 http://localhost:4000

确认没问题后生成静态文件并部署:

hexo clean      # 清理旧产物,改主题或配置后务必执行
hexo generate   # 生成 public/
hexo deploy     # 按 _config.yml 的 deploy 配置发布

部署方案一:Git 裸仓库 + Nginx(最经典)

这是个人站长最常问的「Hexo 怎么部署到自己的服务器」。原理是:在服务器上建一个 Git 裸仓库,本地 hexo deploy 时把生成的 public 推送过去,仓库的 post-receive 钩子再把文件检出到网站根目录。

服务器端,新建裸仓库:

mkdir -p /var/repo/blog.git
cd /var/repo/blog.git
git init --bare

写钩子脚本 /var/repo/blog.git/hooks/post-receive:

#!/bin/bash
GIT_WORK_TREE=/var/www/blog
export GIT_WORK_TREE
git checkout -f

给脚本执行权限并建好网站目录:

chmod +x /var/repo/blog.git/hooks/post-receive
mkdir -p /var/www/blog
chown -R www-data:www-data /var/www/blog

本地 _config.yml 里配置部署目标:

deploy:
  type: git
  repo: root@your-server-ip:/var/repo/blog.git
  branch: master

别忘了装部署插件:

npm install hexo-deployer-git --save

然后 hexo clean && hexo generate && hexo deploy,文件就会被推到服务器并自动检出。

部署方案二:本地生成 + rsync 同步

如果你不喜欢在服务器上装 Git,用 rsync 更直接。本地生成后:

hexo clean && hexo generate
rsync -avz --delete public/ root@your-server-ip:/var/www/blog/

--delete 很重要,它能删掉服务器上已经被你本地删除的文章,避免旧页面残留被搜索引擎继续收录。但要注意:--delete 也会删掉服务器上手动放进去的文件(比如验证用的 .well-known 目录、robots.txt),所以这类文件建议在 source/ 里维护,随生成一起同步。

Nginx 配置:静态站的关键几项

网站目录指向 /var/www/blog,一份够用的 Nginx server 配置:

server {
    listen 80;
    server_name www.example.com;
    root /var/www/blog;
    index index.html;

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

    # 静态资源长缓存
    location ~* \.(css|js|jpg|jpeg|png|gif|webp|svg|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    # HTML 不缓存或短缓存,保证发文后立即生效
    location ~* \.html$ {
        expires -1;
        add_header Cache-Control "no-cache";
    }

    gzip on;
    gzip_types text/css application/javascript application/json image/svg+xml;
    gzip_min_length 1024;
}

注意 try_files $uri $uri/ $uri.html =404; 这一行。Hexo 默认生成的是目录形式(/2026/10/07/xxx/index.html),访问 /2026/10/07/xxx/ 能命中。但如果你在 _config.yml 里开了 pretty_urls: trailing_index: false,生成的是 xxx.html,就需要 $uri.html 这条兜底。两者配置要对应,否则会出现 404。

主题选择与配置:别把主题当花瓶

Hexo 的主题决定站点外观,也影响加载性能和 SEO。挑主题时不只看好不好看,要看三点:是否响应式(手机端体验直接影响搜索排名)、是否轻量(有的主题塞了几百 KB 的 JS 和图标字体,加载慢)、是否还在维护(看一眼 GitHub 最近提交时间,两年没更新的主题可能不兼容新版 Hexo)。热门的如 NexT、Butterfly、Fluid 都是成熟选择。

装主题的通用做法是进 themes 目录 clone 主题仓库,再在 _config.yml 里把 theme 值改成主题目录名:

cd myblog/themes
git clone https://github.com/主题仓库.git 主题名
# 编辑 myblog/_config.yml: theme: 主题名

注意:主题目录里通常还有一个 _config.yml,那是主题自己的配置文件(用来改菜单、颜色、社交链接等)。改主题配置应该复制一份为 _config.主题名.yml 放在站点根目录,这样主题升级时不会和你自己的改动冲突。这是很多新手踩过的坑——直接改主题目录里的配置,下次 pull 更新就被覆盖了。

文章 URL 与 SEO 的几个设置

Hexo 默认 URL 会带上日期和标题。对 SEO 友好且好维护的做法是在 _config.yml 里固定结构。同时用 permalink_defaults 和中文化处理。更重要的是给每篇文章指定英文 slug:在 Front-matter 里加 permalink: my-first-post 或用 abbrlink 插件自动生成短链,避免 URL 里出现中文百分号编码,分享和收录都更干净。

另外记得处理重复内容和死链:开启 pretty_urls: trailing_index: false 去掉 URL 末尾的 index.html,配合 _config.yml 里的 URL 设置保持一致。发布后到搜索引擎站长平台提交 sitemap,Hexo 可以用 hexo-generator-sitemap 插件自动生成。

还要装上 hexo-generator-feed 插件生成 RSS,hexo-generator-searchdb 生成站内搜索索引(配合主题的本地搜索),这些都是一次配置长期受益的基础项。

常见坑与排查

坑一:改了主题但页面没变。 必须 hexo clean 后再 generate。因为 public 里是旧产物,不清理会残留。

坑二:部署后 404,但服务器上文件明明在。 多半是 Nginx 的 root 路径不对,或 try_files 规则与你生成的 URL 形式不匹配。先在服务器上 ls /var/www/blog 确认文件真的同步过去了,再对 Nginx 配置。

坑三:Git 部署报权限错误。 post-receive 钩子以推送用户的身份运行,检出的目录属主会变成该用户。如果你用 root 推送,/var/www/blog 归 root,www-data 读不到就会 403。解决:在钩子里加 sudo -u www-data 或提前把目录权限设好。

坑四:文章发布时间是未来或过去。 Hexo 默认不显示未来时间的文章,如果 date 写错了会「文章消失了」,检查 Front-matter 的 date。

坑五:中文字符导致 URL 乱码。 Hexo 的默认 permalink 会带中文,建议在 _config.yml 里配置英文或数字化的 permalink,如 permalink: :year/:month/:day/:title/ 配合文章文件名用英文,对 SEO 和分享都更友好。

什么时候不该用 Hexo

静态博客不是万能的。如果你需要:访客留言并实时显示、会员登录、评论审核后台、在线搜索大数据量、多作者协同,那纯静态会很别扭(虽然可以用 GitHub Issues、Waline 等第三方评论系统补齐,但会增加复杂度)。这种场景下,WordPress 或 Typecho 反而更省心。判断标准很简单:内容为主、交互为辅,选静态;交互为主、内容为载,选动态。

对大多数写技术教程、做内容沉淀的个人站长来说,Hexo 这类静态生成器能在极低的服务器成本下提供又快又安全的站点,还能顺便把源码托管到 Git 上实现版本管理,是很值得投入一次学习成本的选择。

Last modification:October 7th, 2026 at 10:27 pm

Leave a Comment