← 返回文章 ESSAY

从 WordPress 到 1.2MB 的 Rust 博客

一台 1.6GB 的阿里云被 WordPress 和 MySQL 拖垮之后,我用一个不到 1MB 的 Rust 二进制替换了整套博客系统。

目录 · 14 节
  1. 01起因
  2. 02决定:自己写一个
  3. 03技术选型
  4. 04代码结构(约 250 行)
  5. 05依赖
  6. 06体积优化
  7. 07部署
  8. 08最终对比
  9. 09踩过的坑
  10. 10Rust 的 format! 宏会吃掉 CSS 的花括号
  11. 11不要在服务器上编译
  12. 12glibc 版本
  13. 13现在的博客
  14. 14小结

起因

一台 1.6GB 内存的阿里云跑着太多东西:MySQL、Gitea、WordPress、RustDesk 中继、EasyTier、WebDAV……

结果就是:内存长期吃紧,某天直接卡死 —— 能 ping 通,但 SSH、HTTP 全部超时。

排查后发现 WordPress + MySQL 占了 240MB。

而我已经很久没写博客了。

决定:自己写一个

需求很简单:

  • 写 Markdown
  • 网页上看
  • 内存越小越好

那就不需要 WordPress 了。

技术选型

方案内存评价
WordPress240MB太重
Node + Express92MB还是重
Rust + tiny_http1.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;
}

最终对比

指标WordPressRust
内存240 MB1.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 倍。

有时候"自己写"不是炫技,是真的更简单。