使用符号链接实现静态资源版本平滑发布是最轻量可靠的方式——nginx自动解析软链接,无需重启、不中断请求,切换毫秒级完成;前提是构建产物带内容哈希,js/css/图片等文件名含哈希,html引用路径同步更新,html本身短缓存,构建目录按版本隔离,root指向软链接,发布仅需原子替换软链接,配合合理缓存头(哈希资源长缓存、html不缓存)。

直接在 root 指令中使用符号链接,是实现静态资源版本平滑发布的最轻量、最可靠方式——Nginx 会自动解析软链接目标路径,无需重启、不中断请求,切换毫秒级完成。
确保构建产物带内容哈希
这是整个策略的前提。JS/CSS/图片等资源文件名必须包含内容哈希(如 app.a1b2c3.js),HTML 中引用的路径也需同步更新。这样浏览器能自然区分新旧资源,避免缓存混用。
- Webpack/Vite 等构建工具默认支持
contenthash或fullhash,启用即可 - HTML 文件本身不加哈希,但必须短缓存(如
Cache-Control: no-cache),确保用户总能拿到最新版 HTML - 构建输出目录按版本隔离,例如:
/var/www/static/v1.0.0/、/var/www/static/v1.0.1/
配置 root 指向软链接
Nginx 的 root 指令天然支持符号链接解析,只要 worker 进程有读权限,就能正确访问目标目录下的文件。
- 创建软链接:
ln -sf /var/www/static/v1.0.0 /var/www/static/current - 在 server 块中写:
root /var/www/static/current; - 配合
try_files $uri $uri/ =404;,保证路径查找逻辑清晰 - 无需开启
disable_symlinks,也不用改 Nginx 权限模型
发布时只替换软链接
上线新版本就是一条原子命令,无任何中间态,旧版本目录完整保留,随时可回滚。
- 先确认新目录就绪:
ls -l /var/www/static/v1.0.1/(检查文件存在且可读) - 执行切换:
ln -sf /var/www/static/v1.0.1 /var/www/static/current - 所有新请求立即命中
v1.0.1目录,旧连接仍可完成加载,无 404 或中断 - 旧版本目录不删,回滚只需再执行一次
ln -sf指向之前版本
搭配合理的缓存响应头
仅靠目录切换还不够,必须让浏览器按规则拉取资源:HTML 要快更新,哈希资源要长缓存。
- 对带哈希的静态资源(JS/CSS/图片)加:
expires 1y; add_header Cache-Control "public, immutable"; - 对 HTML 文件单独设置:
add_header Cache-Control "no-cache, must-revalidate"; - 避免用
max-age=0或no-store,它们会强制校验,抵消哈希优势











