写博客不仅仅是文字的输出,对于一名工程师来说,博客本身就是一个不断迭代、优化的工程项目。本站自搭建以来,经历了从简单的静态页面生成到如今高度自动化的转变。今天分享一下这个博客背后的技术栈与工程实践。
🏗 全栈架构设计
本站基于 Hugo 构建,采用了全容器化(Docker)的部署方案。为了保证数据自控和极简运维,我并没有选择像 Algolia 或各种第三方评论插件,而是全部采用自建服务。
核心技术栈
- SSG: Hugo (PaperMod 主题)
- Web Server: Nginx (Alpine)
- 评论系统: Remark42 (Golang 编写,自托管)
- 监控系统: Grafana + Loki (日志观测)
- 部署方式: Docker Compose
- 自动化工具: Python + uv (用于图像处理与资源管理)
系统架构图
graph TD
User((访问者)) --> FRP[FRP 公网隧道]
FRP --> Nginx{Nginx 反向代理}
Nginx --> Static[静态 HTML 资源]
Nginx --> Remark42[Remark42 评论 API]
Nginx --> ImageHost[自建 Nginx 图床]
Nginx -- JSON 日志 --> Loki[(Loki 日志池)]
Loki --> Grafana[Grafana 面板]
subgraph "Docker 内部网络"
Static
Remark42
ImageHost
end
🚀 关键工程实践
1. 评论系统的“自强不息”
在对比了 Giscus (基于 GitHub) 和传统的 Disqus 后,我选择了 Remark42。
- 原因:它是用 Go 写的,非常轻量且高效,支持 Docker 一键部署,数据完全存储在本地,不依赖第三方账号,对隐私极度友好。
- 工程细节:通过 Nginx 转发
/comments路径,实现了跨域友好和 SSL 证书共用。
2. 可视化监控:Grafana 与日志分析
为了实时掌握博客的运行状态,我通过读取 ../nginxlog 下的日志实现了可视化监控。
- 结构化日志:我在 Nginx 配置中定义了
json_main格式。相比传统的文本日志,JSON 格式能让监控系统无痛解析各种字段(如:真实 IP、响应时长、User-Agent 等)。 - 监控链路:利用 Promtail 实时抓取日志目录并推送到 Loki,最后在 Grafana 中呈现。通过配置 Dashboard,我可以直观地看到:
- 全球访问流量的热力分布图。
- 4xx/5xx 错误码的实时曲线(及时发现恶意扫描)。
- 热门文章的 PV/UV 排名。
3. 自动化图像处理流水线
为了解决每篇博客封面图“选择困难症”和 SEO 预览问题,我编写了一套 Python 工具链:
- 封面自动生成 (
gen_cover.py):利用Pillow库,根据文章的标题和标签,自动从高清图库抓取精美背景,并合成纯净的封面图。 - 极简图床管理 (
manage_images.py):- 既然已经有了 Nginx,何必再用付费图床?
- 我在 Nginx 中映射了一个
/images路径,管理脚本只需一行命令即可将本地图片同步至存储目录,并自动生成 Markdown 链接。
4. 生产环境的“内网穿透”
由于博客部署在本地高性能机器上,我使用了 FRP 建立公网隧道。
- 优化点:在 Nginx 层通过
real_ip模块解析 FRP 传递的proxy_protocol,从而精准获取访问者的真实 IP,这对于监控准确性和评论系统的反垃圾至关重要。
📈 SEO 与性能调优
静态博客的优势在于快,但如果不注意细节,SEO 会很糟糕。本站做了如下优化:
- JSON-LD 结构化数据:方便搜索引擎理解文章内容。
- 静态资源缓存:在 Nginx 层面为图片和静态资源开启了
30d的长期缓存。 - 429 限流保护:针对扫描器频繁请求,配置了
limit_req模块,并合理设置burst缓冲区,确保真实用户的流畅加载。
💡 总结
一个好的个人博客应该是好读、好写、且好维护的。 通过这套工程实践,我实现了一次构建、全自动化处理资源、数据完全自控且可观测的目标。代码和文字都在我自己的服务器里,这种安全感和掌控感是任何第三方平台给不了的。
以后,我会继续探索 AI 辅助内容分析 以及 更深度的自动化工具链,让写作回归纯粹。
Making progress every day.