静态资源平滑发布更新的核心是通过目录隔离、符号链接、缓存协同和路径映射四层配合实现新旧版本共存与原子切换;构建时采用内容哈希确保资源一致性,nginx 通过 rewrite 和 try_files 支持旧路径兼容,并用日志追踪与热重载保障上线质量。

静态资源平滑发布更新,核心是让新旧版本共存、切换无感知、不中断加载,同时避免用户拿到混搭资源(比如新版 HTML 引用了旧版 JS)。它不依赖重启或重定向,而是靠目录隔离 + 符号链接 + 缓存协同 + 路径映射四层配合。
用符号链接实现原子切换
每次构建产出独立版本目录,例如:
/var/www/static/v1.0.0/
/var/www/static/v1.0.1/
/var/www/static/current → /var/www/static/v1.0.0(软链接)
Nginx 的 root 指向 /var/www/static/current,自动解析真实路径。发布时仅执行:
ln -sf /var/www/static/v1.0.1 /var/www/static/current
该操作在 Linux 上是原子的,毫秒生效,旧版本目录保留,可随时回滚。
用哈希文件名保证资源一致性
构建阶段为 JS/CSS/图片等注入内容哈希,如 app.a1b2c3.js。这样文件内容变,URL 就变,浏览器必然拉新资源。
HTML 文件本身不加哈希,但需设短缓存(如 expires 1m;),确保能及时获取新入口;而带哈希的静态资源设长缓存 + immutable:
location ~* \.(js|css|png|jpg|gif|woff2)$ { expires 1y; add_header Cache-Control "public, immutable"; }
用 rewrite + try_files 支持旧路径兼容
前端代码还没全量更新时,仍会请求 /static/v1/js/app.js 这类旧路径。Nginx 可主动重写并兜底:
— 匹配旧路径:
location /static/v1/ { rewrite ^/static/v1/(.*)$ /assets/$1 last; }
— 同时用 try_files 回退到原路径或报错,防止 404 中断:
try_files $uri /assets/$1 =404;
这样既支持渐进收敛,又不阻断加载。
用日志追踪与热重载保障上线质量
上线后通过自定义 access_log 记录哪些旧路径还在被访问,针对性补资源或推动前端修改:
log_format migration '$remote_addr - $request_uri → $status';
access_log /var/log/nginx/migration.log migration;
缓存头或路径规则变更后,执行 nginx -t && nginx -s reload 热重载,不中断连接,新规则对后续请求立即生效。











