实测手记 · 一个人做站的过程记录

建站、埋点、收录,都是自己动手量的

我把几个小站从零搭起来的过程记在这里:用什么方式建的、怎么埋数据、怎么看收录、备案与部署踩了哪些坑。不卖工具、不接单,只写自己真的做过的。

有据可查 不吹数字 持续更新

实践归档

把亲手搭起来、或亲手改过的几个站按时间归档,过程与坑都写下来。

小满手记(zangeng.com) · 个人静态站 · 2026

一个只记录日常的站

用同一套零依赖静态站方法搭起:一份 HTML 模板加一份数据 JSON,内容分短札、摘录、随笔三类,底色是历史与哲学。不注册、不互动、不交易,联系只留一个邮箱。

6
页面
3
内容类型
1
联系入口
静态站零构建个人站
年表拾遗(20101115.com) · 历史年表 · 数据驱动

把历史事件串成一条时间线

对接 history 数据集,按朝代与年份排列事件,支持纪年换算与关键词检索。所有内容构建期拉取渲染,可追溯来源;空数据区块自动隐藏,不留空白。

5
页面
3
核心功能
1
数据源
历史年表数据驱动
实测手记(585.ink) · 技术实践记录 · 本站

把做站的过程记下来

本站本身即是那套方法的样板:记录零依赖静态站的搭法、埋点与收录的口径、个人非经营性备案下的合规边界,以及 GitHub SSH 推送部署。不卖工具、不接单。

4
页面
4
内容支柱
0
构建依赖
静态站埋点合规

最近写的

建站、埋点与收录的实测笔记。

用 Caddy 给静态博客加一层自签 HTTPS 反代

我的博客是 Hugo 生成的纯静态站,之前直接丢在 Nginx 后面跑 80 端口,后来想把内网预览和公网访问分开,就在同一台小机器上加了 Caddy 做反代。做法是让 Caddy 监听 443 并自动申请 Let's Encrypt 证书,静态文件继续由 Nginx 在 127.0.0.1:8080 提供,Caddy 只负责 TLS 终止和转发。踩的坑有两个:一是 Caddy 默认会去占用 80 端口做 ACME 挑战,和已有 Nginx 冲突,改成 tls 配置里指定 acme_ca 并让 Nginx 只监听 8080 才绕开;二是 Hugo 生成的目录权限是 755,Caddy 以非 root 运行读不到,chmod -R 755 后正常。结论是静态站加一层 Caddy 反代成本很低,证书续期也省心,但端口规划一定要提前想清楚。

把静态站迁到自建 Nginx 并开启 Brotli 的完整记录

把跑在托管平台上的静态站迁到自建 Nginx,先在本地用同一份构建产物起容器验证,确认路由和 404 行为一致后再切 DNS。编译 Brotli 模块时踩了动态模块 ABI 不匹配的坑,改用与 Nginx 同源编译的源码重新生成模块才加载成功,并给 brotli_static 配了预压缩文件。缓存策略上对 HTML 设 no-cache、对带哈希的静态资源设一年 immutable,同时保留 gzip 作为回退。切换后首字节时间下降,Brotli 对文本类资源的压缩率优于 gzip。结论是自建部署可控性更强,但模块版本必须与 Nginx 严格对齐,预压缩和缓存头要一起设计。

用 Caddy 给静态站加自动 HTTPS 与 Brotli

把 585.ink 从 Nginx 换到 Caddy,主要是想省掉 certbot 续期和 gzip 配置这两件烦事。做法:先备份原 Nginx 配置和证书目录,再用 Caddyfile 声明站点,encode 指令同时开 zstd、gzip 和 brotli,file_server 指向 /var/www/blog,并在 handle_errors 里自定义 404。坑有两个:一是 Caddy 默认用 80 端口做 ACME 挑战,而我的机器上旧 Nginx 还占着,必须停掉再启动,否则证书签发一直 pending;二是 brotli 对已经压缩过的图片没收益,反而多一层 CPU,我在 encode 后加了 match 排除图片后缀。结论:静态站迁 Caddy 后配置从 60 行降到 12 行,证书自动续期不用再管,Lighthouse 的文本压缩项直接满分,但动态反代场景仍需评估。

用 Caddy 反代替换 Nginx 后我的静态站省心了

把跑了两年的 Nginx 静态站换成 Caddy,起因是每次加子域都要手写 server 块和证书路径。做法是装好 Caddy 后用一条 file_server 指令托管目录,反代部分用 reverse_proxy 指向本地 127.0.0.1 端口,证书交给它自动申请和续期。实际踩的坑有两个:一是 Caddy 默认监听 80/443,与旧 Nginx 冲突导致启动即报端口占用,先停掉 Nginx 再切换;二是前端用的 History 路由刷新 404,需要加 try_files 等价的 handle 配置把请求回落到 index.html。结论是配置量从几十行降到十来行,证书续期不再靠 cron,静态站和轻量反代场景完全够用,重写规则复杂的项目仍建议留在 Nginx。

把静态站迁到自建 VPS 的完整踩坑记录

把长期跑在托管平台的静态站迁到自建 VPS,用 Nginx 直接托管构建产物并在本机跑 certbot 签发证书。关键做法是先用 rsync 把 dist 同步到 /var/www,再单独建站点配置,避免改动默认 server 块;证书续期改为 systemd timer 触发,并在 Nginx 配置里预留 /.well-known/acme-challenge 路径,防止 webroot 校验被重定向规则拦截。踩的坑主要有三个:一是 DNS 的 A 记录改完后本地仍命中旧 IP,排查后确认是递归缓存未过期,用公共解析器验证才定位;二是权限问题,rsync 后文件属主是 root,Nginx worker 读不到,加 --chown 参数解决;三是忘记放行 80 端口,certbot 一直超时。结论是自建托管成本可控、可控性更强,但每次变更都要把 DNS、权限、防火墙三件事逐条过一遍,做成检查清单最省心。

给静态博客加上全文搜索:从 40MB 索引压到 1.2MB

我的博客用纯静态生成器部署在对象存储上,文章涨到 300 多篇后站内搜索成了刚需。第一版直接用构建脚本把全部正文塞进一个 JSON,产物 40MB,首屏要等好几秒,移动端基本不可用。这次改成构建期切词建倒排索引:用 jieba 对标题和正文分词,过滤停用词,记录每篇文章的词频与位置偏移,同时写入文章元数据表。查询时先匹配词项再按词频和标题命中加权排序,只返回摘要片段和锚点,不加载全文。索引分片成若干小文件按需拉取,gzip 后 1.2MB。踩的坑是中文分词对英文技术词会切碎,加了英文词表保护;另外停用词过滤太狠会漏召回,把高频虚词保留但降权。结论是静态站也能有可用的全文搜索,关键是索引体积和首屏加载的权衡。

用 Caddy 反代换掉 Nginx 的实测记录

站点原先跑 Nginx + 手动 certbot 续期,证书偶尔因 cron 失败导致过期。这次换成 Caddy 2,做法是:用 apt 装 Caddy,Caddyfile 里只写域名、root 和 file_server,TLS 由 Caddy 自动申请与续期,再用 reverse_proxy 把 /api 转发到本地 Node 服务。迁移时踩了两个坑:一是 80 端口被旧 Nginx 占用导致 ACME 挑战失败,必须先停服务并确认防火墙放行;二是 Caddy 默认以 caddy 用户运行,静态目录权限不足会返回 403,需 chown 或调整目录权限。切换后证书续期无需人工干预,配置文件从近百行缩到十几行,负载相近。结论:个人站点用 Caddy 替代 Nginx 能显著降低证书维护成本,但端口占用与文件权限必须在切换前处理好。

给静态站加一层 Caddy 反代并自动续签证书

站点原本用 Nginx 直接托管静态文件,为了把证书续签、HTTP/2 和 gzip 收敛到一处,我改成了 Caddy 反代后端 Nginx 的结构。做法是让 Nginx 只监听 127.0.0.1:8080 提供纯静态内容,Caddy 占 80/443 负责 TLS 与自动续签,配置里用 reverse_proxy 指向本地端口并开启 encode gzip。踩到的坑有两个:一是 Caddy 首次签发需要 80 端口可达,若被云厂商安全组挡住会一直卡在 ACME 校验;二是反代后日志里拿到的都是 127.0.0.1,需通过 X-Forwarded-For 并配 trusted_proxies 才能还原真实访客 IP。改完证书续签不再需要手动干预,静态资源命中本地回环,延迟没有明显变化。

一份 JSON 加一个脚本,搭出零依赖静态站

这个站没有打包器、没有 node_modules。一份 HTML 模板 + 一份数据 JSON + 一个 Node 预渲染脚本,跑一次就把内容渲染成静态 HTML。禁用 JS 也能读到全文,部署到任意静态托管即可。

事件表先登记,再埋点:我对账不掉数的做法

把要埋的事件先登记成口径表(conversion.json),页面埋点与脚本各填一处。构建期脚本双向对账:登记了没埋的、埋了没登记的都列出来,数字才信得过。

收录从 0 条起步:我的观测与回填台账

不吹「服务了多少团队」。用一份 observation.json 跟踪每个页面提交与收录状态,sitemap 提交后人工逐条核对,收录状态回写台账,空着就标 unknown,不编造数字。

个人非经营性备案为什么挂不了广告

292 号令第十一条:非经营性备案站点不得从事有偿服务,无证经营罚则 10 万–100 万。所以这类站不挂广告、不接单、不写报价,商业需求放到该放的主体下。

三个站共用一套:GitHub SSH 推送即部署

主站 HTTPS 推送被挡后改用 SSH 协议,各静态仓库注册仓库级 runner,git push 即触发部署。联系只留一个邮箱,反馈与其他需求统一跳到 antucao.com,入口不发散。

常见问题

没找到答案?直接联系我。

这是什么站?
一个个人技术实践记录站,记录建站、埋点、收录与合规部署的实测过程,不卖工具、不接单。
内容是怎么来的?
都是我自己做过的项目与踩过的坑,只写有据可查的,没做过的不写。
怎么联系你?
到「联系」页用邮件入口给我写信(xlm8826@gmail.com)。反馈或其他联系需求,统一跳转到 antucao.com,不放其他入口。
文章会更新吗?
会持续更新。新踩的坑和新做的实践,整理好后会陆续放上来。

想一起聊聊?

关于建站、埋点、收录或合规部署,欢迎来信。

看到会回复,不保证秒回。