个人网站技术实现
技术栈选型
选用 Rust + Axum 作为后端,SQLite 作为数据库,Tera 模板引擎做服务端渲染,前端用原生三剑客配合 HTMX 做交互增强。
为什么这样选?
- Rust/Axum:性能好、内存安全、编译时就能发现很多问题。对于 2C2G 的低配服务器,Rust 的静态编译产物运行起来非常轻量,几乎没有运行时开销。
- SQLite:零配置,单文件,不需要额外维护数据库进程。对于个人网站这种低并发场景完全够用。
- SSR + HTMX:不写前后端分离,不搞 SPA。服务端直接渲染 HTML,HTMX 在需要局部刷新的地方做增强,开发效率高,维护也简单。
架构设计
传统的 MVC 模式:
浏览器 → Nginx (SSL 反代) → Axum → SQLite
所有页面由后端渲染完整的 HTML 返回,不需要客户端路由。管理后台的表单提交走传统 POST,图片上传用 JS fetch 异步处理。
数据模型分为几个核心模块:
- 文章:标题、slug、Markdown 正文、渲染后的 HTML、摘要、发布状态
- 项目:名称、描述、技术栈、链接、排序权重
- 软件包:包信息 + 多个版本 + 文件上传/下载
- 站点设置:键值对存储,用于头像、关于页内容、简介等动态配置
路由设计
公开路由就是简单的页面路径,后台路由按资源组织 CRUD。
每个后台路由处理函数的标准流程是:
- 验证 JWT Cookie(未登录则重定向)
- 查询或写入数据库
- 渲染模板或重定向
没有引入复杂中间件,每个路由显式调用鉴权函数,代码流向清晰。
认证方案
采用 JWT + Cookie 的方式。登录成功后在服务端生成 JWT,通过 HttpOnly Cookie 返回给浏览器。后续请求自动携带 Cookie,后台路由从中提取并验证 token。
密码使用 Argon2id 哈希存储,这是目前公认最强的密码哈希算法。
另外加了一个简单的登录保护:1 小时内连续 3 次密码错误会锁定账户,需要 SSH 到服务器执行脚本解锁。虽然是个小站点,但该防的还是要防。
部署
部署在阿里云 2C2G 的 ECS 上,系统 Ubuntu。
- 后端通过 systemd 托管,崩溃自动重启
- Nginx 做反向代理和 SSL 终端
- HTTPS 证书用 Let's Encrypt,certbot 自动续签
- HTTP 自动 301 重定向到 HTTPS
整个运维成本很低,基本写完代码编译上传就能跑。