静态发布消除了应用运行时的复杂度,但不会消除生成目录与公共响应之间的边界。发布检查应同时覆盖两边。

一条小的静态发布路径

先在使用预期配置的待发布服务器上检查确切制品,切换目录后在公共边缘重复检查。将 index.html、下载资源和 404.html 与解码后的 GET 正文配对。字节比较与预期状态、类型、缓存、安全头分别检查。重复中英文样本,并在新目录通过检查前保留上一个已知良好目录。
切换前后使用同一份制品。下载行对应文中的 public/downloads/check-http-headers.sh。cmp 比较前会解码受支持的内容编码;服务器转换需有明确比较规则。状态和响应头另行检查,并保留前一目录供主动回滚。

从干净的制品开始

使用固定生成器构建到干净的目录。记录源码提交、生成器版本、输出文件列表,以及用户会下载的文件的校验和。一次干净的构建能捕获复制式部署可能会意外保留的陈旧文件。

set -eu
make verify
find public -type f -print | sort

文件列表是证据,不是装饰。如果某条路由消失,diff 应能说明是该来源被移除,还是生成器未能产出它。

演练三类响应

发布前,用预期服务器配置测试待发布制品。切换目录后,在公共边缘重复检查;探测仍在线的旧站不能验证新发布。请求一个 HTML 页面、一个静态资源与一个缺失路径。检查状态码、内容类型、缓存策略与安全头:

set -eu
curl --compressed -fsS -D page.headers -o page.body https://www.example.test/
curl --compressed -fsS -D asset.headers -o asset.body \
  https://www.example.test/downloads/check-http-headers.sh
curl --compressed -sS -D missing.headers -o missing.body \
  https://www.example.test/does-not-exist

cmp public/index.html page.body
cmp public/downloads/check-http-headers.sh asset.body
cmp public/404.html missing.body

把每个片段作为独立 shell 脚本运行,或放在可丢弃的 shell 会话中执行。set -eu 让这个顺序脚本在构建、传输或比较失败后停止,避免后面的成功命令掩盖先前失败。缺失路径的请求有意不用 -f:404 是预期结果,仍应被捕获。检查各响应头文件的最终状态:依次为 200、200、404;字节比较不会自动完成状态码检查。这里不跟随重定向。--compressed 在比较前解码受支持的内容编码;若服务器有意转换 HTML,需要另行说明比较规则。cmp 相等时不输出,有差异时返回非零。在 /zh/ 及其错误页上重复检查,不能直接假设两种语言一致。

让回滚保持简单

在新目录通过检查之前,不要删除上一个目录。回滚应选择一个已知良好目录,而不是在事故中凭记忆重新构造一个。发布检查清单与HTTP 响应头检查都刻意做得足够小,能在干净的 shell 里运行。

来源