← 返回文章
ESSAY
从 WordPress 到 1.2MB 的 Rust 博客
一台 1.6GB 的阿里云被 WordPress 和 MySQL 拖垮之后,我用一个不到 1MB 的 Rust 二进制替换了整套博客系统。
起因
一台 1.6GB 内存的阿里云跑着太多东西:MySQL、Gitea、WordPress、RustDesk 中继、EasyTier、WebDAV……
结果就是:内存长期吃紧,某天直接卡死 —— 能 ping 通,但 SSH、HTTP 全部超时。
排查后发现 WordPress + MySQL 占了 240MB。
而我已经很久没写博客了。
决定:自己写一个
需求很简单:
- 写 Markdown
- 网页上看
- 内存越小越好
那就不需要 WordPress 了。
技术选型
| 方案 | 内存 | 评价 |
|---|---|---|
| WordPress | 240MB | 太重 |
| Node + Express | 92MB | 还是重 |
| Rust + tiny_http | 1.2MB | ✅ |
选 Rust 的原因:
- 静态编译,没有运行时
- 依赖少(不需要 tokio/axum)
- 编译产物 < 1MB
代码结构(约 250 行)
// 核心就几件事
// 1. 读文章列表
fn list_posts() -> Vec<PostMeta> {
// 遍历 /opt/blog/posts/*.md
// 解析 YAML frontmatter
}
// 2. Markdown → HTML
fn md_to_html(md: &str) -> String {
let parser = Parser::new_ext(md, opts);
html::push_html(&mut out, parser);
}
// 3. HTTP 路由
for req in server.incoming_requests() {
match (req.method(), req.url()) {
(Get, "/") => 首页,
(Get, "/:slug") => 文章页,
(Get, "/api/posts") => JSON 列表,
(Post, "/api/posts/:slug") => 保存,
}
}
依赖
[dependencies]
tiny_http = "0.12" # HTTP 服务器
pulldown-cmark = { version = "0.9", default-features = false } # Markdown
serde = { version = "1", features = ["derive"] }
serde_json = "1"
就四个。编译 3 秒。
体积优化
[profile.release]
opt-level = "z" # 优化体积
lto = true # 链接时优化
codegen-units = 1
panic = "abort" # 不展开栈
strip = true # 去符号
结果:771KB。
部署
# 本地编译(不要在服务器上编译!)
cargo build --release
# 产物传上去
scp target/release/blog-server server:/opt/blog/
# systemd
[Service]
ExecStart=/opt/blog/blog-server
Restart=always
加上 nginx 反代:
location / {
proxy_pass http://127.0.0.1:8770;
proxy_set_header Host $host;
}
最终对比
| 指标 | WordPress | Rust |
|---|---|---|
| 内存 | 240 MB | 1.2 MB |
| 进程数 | 5+ | 1 |
| 数据库 | MySQL 8.4 | 无 |
| 启动 | 数秒 | <10ms |
| 二进制 | - | 771 KB |
| 备份 | 数据库导出 | cp -r posts/ |
内存省了 99.5%。
踩过的坑
Rust 的 format! 宏会吃掉 CSS 的花括号
format!("<style>body{{color:red}}</style>") // 需要双花括号
如果直接粘贴 CSS(单花括号),编译会报:
error: invalid format string: expected `}`, found `;`
解决:把 CSS 里的 { } 全部换成 {{ }}。
不要在服务器上编译
- 编译需要 1GB+ 内存,会把小内存机器打挂
- 编译要装 Rust 工具链(几百MB)
- 本地编译,传二进制
glibc 版本
本地(新系统)编译的二进制,在旧系统上可能跑不了:
GLIBC_2.34 not found
解决:用 --target x86_64-unknown-linux-musl 静态编译,或者确认目标机 glibc 版本。
现在的博客
https://dkjsiogu.cn —— 暗色主题,Markdown 写作,1.2MB 内存。
写文章就是:
cat > /opt/blog/posts/my-post.md << 'EOF'
---
title: 标题
date: 2026-10-21
tags: 标签
---
正文...
EOF
小结
不是所有东西都需要框架。
一个博客的本质就是:
- 一堆 Markdown 文件
- 一个把 Markdown 转成 HTML 的函数
- 一个能返回 HTML 的 HTTP 服务器
250 行 Rust 就够了,而且比 WordPress 快 100 倍。
有时候"自己写"不是炫技,是真的更简单。