静态资源原子发布通过符号链接切换版本目录实现,避免半新半旧状态;nginx指向current软链接,发布时用ln -sf原子替换,配合html短缓存与资源哈希长缓存提升可靠性。

静态资源的原子发布,核心是避免用户在更新过程中访问到“半新半旧”的文件(比如 HTML 已更新但 JS 还是旧版),关键在于切换而非覆盖——用符号链接指向当前生效版本目录,并通过原子替换链接完成发布。
准备多版本目录结构
不要直接往生产目录里覆盖文件。建议按版本号组织静态资源目录,例如:
- /var/www/static/v1.0.0/(含 index.html、app.js、style.css 等)
- /var/www/static/v1.0.1/(新版本构建产物)
- /var/www/static/current → /var/www/static/v1.0.0(软链接,Nginx 实际读取此路径)
配置 Nginx 指向 current 链接
在 server 块中使用 root 指令指向链接路径,Nginx 会自动解析符号链接:
location / {
root /var/www/static/current;
index index.html;
try_files $uri $uri/ =404;
}
注意:无需额外开启 disable_symlinks,只要确保链接目标在 Nginx worker 进程有读取权限即可。
发布时执行原子切换
用 ln -sf 替换链接,该操作在 Linux 上是原子的(不会出现中间态):
- 构建完新版本后,先确认 /var/www/static/v1.0.1/ 完整可读
- 执行:
ln -sf /var/www/static/v1.0.1 /var/www/static/current - 所有后续请求立即看到新版本,旧版本目录仍保留,可随时回滚
配合缓存与校验提升可靠性
为防止浏览器缓存旧资源导致不一致,建议:
- 对 HTML 使用短缓存(如
expires 1m;),确保能及时拉取新入口 - 对 JS/CSS/图片等资源加哈希后缀(如
app.a1b2c3.js),并设长缓存(expires 1y;) - 发布脚本中校验新版本目录是否存在关键文件(如
index.html),失败则中止链接切换











