这个笔记站是怎么搭的:一份静态页 + 反代的极简做法
一开始想用现成的博客系统,装了半小时发现光插件和安全更新就够折腾的。 后来想明白了:我只是要写文章,不需要后台、不需要数据库、不需要评论。
最终形态
- 4 个 HTML 文件 + 1 个 CSS 文件 + 1 个生成脚本
- 没有数据库,没有 CMS,没有前端框架,没有 Node 构建
- 所有文章是脚本里的字符串模板,改完运行一次就生成
为什么不直接手写 HTML
因为导航栏和页脚要在每个页面重复。手写意味着改一次站点名要改四遍, 总有漏的。用一个几十行的 Python 脚本拼公共头尾,成本最低,也最容易维护。
放在哪
站点跑在一台小服务器上,Nginx 把 80/443 反代给本机的 Node 服务。
笔记页作为静态目录放在应用的静态资源根目录下,Nginx 的 location /
会先交给 Node 的静态中间件,命中文件就直接返回,没命中才走应用路由。
location / {
proxy_pass http://upstream_app;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
好处是:笔记页和主应用同域、同一张证书,不用多配一个 server 块, 也不用为纯静态内容单开一个虚拟主机。
踩过的三个坑
1. 静态目录被构建产物覆盖
第一次直接把页面放进构建输出目录,结果下次发版被清空了。 改成放进构建的源目录,构建时自动拷过去,问题消失。
2. 缓存导致改完不生效
HTML 必须不缓存,否则改了标题用户还是看到旧的。 静态资源带内容 hash 才能长缓存。这两条要分开配:
# 静态资源:长缓存
add_header Cache-Control "public, max-age=31536000, immutable";
# HTML:不缓存
add_header Cache-Control "no-cache";
3. 备案号必须能点
这是很多人忽略的合规细节:页脚的备案号要链接到工信部备案系统, 而且要全站可见。这不只是形式要求,抽查时会核。
够用就行
这套东西的性能没什么可优化的 —— 全站压缩后不到 30KB,服务器负载可以忽略。 省下来的时间用来写文章,比继续折腾架构划算得多。
← 返回首页