corpusctl vs WordPress:你得到什么,又放弃什么
无头 WordPress 把一个 API 硬装到页面渲染器上。这里是关于迁移的诚实理由、真实的代价,以及继续留在 WordPress 上的三个好理由。
大多数 WordPress 站点都应该继续留在 WordPress 上。
这不是一句修辞性的开场白。WordPress 支撑着网络中巨大的份额,因为它免费、可扩展,并拥有一个竞争对手无法匹及的人才库。如果一个团队编辑一个站点、主题能满足你的需求、流量又稳定——那么一次迁移会耗掉你几个月,却几乎买不到什么。
本文要谈的,是那些上述前提不再成立的情形。
无头 WordPress 是一种改造,而且看得出来
WordPress 可以通过 REST API 或 WPGraphQL 暴露内容,也有很多团队成功地这么做了。但值得把你到底在运行什么说清楚。
WordPress 的核心职责是渲染页面:查询数据库、运行主题、触发钩子、返回 HTML。走向无头意味着保留那套机器、在每个请求上启动它,然后丢弃它的输出,转而使用一个你另行组装的 JSON 响应。
你最终会在一个进程里运行两套系统。后台是一个页面渲染器。API 是页面渲染器之上的一层。而插件——正是你选择 WordPress 的原因——是为页面渲染器写的,一个给编辑器添加字段的插件,未必会把该字段添加到 API 中。
corpusctl 从不渲染页面。没有主题层、没有模板层级、没有需要推敲的钩子顺序。读取客户端是主要接口,而不是外挂上去的东西。
当有人读你的文章时,实际发生了什么
WordPress: 请求到达 PHP,PHP 查询 MySQL,插件运行,主题渲染。然后你在前面加一个缓存插件,也许再在它前面加一个 CDN,并且在缓存失效上花掉实打实的时间——因为页面是算出来的,而缓存只是某个随时可能改变的计算结果的副本。
corpusctl: 发布会触发构建流水线。内容被校验、渲染,并写入对象存储中一个不可变、以哈希寻址的文件;清单随之刷新。访客的客户端在本地把 slug 解析到某个清单分片,然后从nginx 边缘缓存中取回那个地址。
由于该地址是内容哈希,同一个地址永远不会返回不同的内容——因此它可以缓存三十天而无需任何失效策略。发布会写入一个新地址。没有任何东西需要清除。
两次 HTTP 请求,都来自缓存。两者都不到达 API,都不到达 PostgreSQL。
由此得出的结论:访客流量根本不会加载你的写入路径。一位编辑在流量高峰期保存草稿,并不会与这个高峰争抢资源。
插件面同时也是攻击面
插件生态是 WordPress 最大的优势,而它与其最大的运维风险是同一句话。每个插件都是运行在你进程里、拥有数据库访问权限的第三方代码。一个装了三十个插件的站点,就有三十条更新流和三十个潜在的 CVE,而出问题的那个插件,往往是谁都不记得装过的那个。