为什么个人站长还在用 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 上实现版本管理,是很值得投入一次学习成本的选择。