nginx 通过版本化路径(如 /v1/、/v2/)实现资源版本隔离与缓存控制,配合 alias 映射、软链接更新及可选 map 动态路由,确保零停机、缓存一致与灰度发布能力。

用带版本前缀的 URL 路径做天然缓存隔离
浏览器和 CDN 都以完整请求 URL 为缓存键。只要版本体现在路径中(如 /v1/assets/app.js 和 /v2/assets/app.js),它们就是两个完全独立的缓存项,不会互相覆盖。
- 前端构建时,确保每个版本的
homepage或 public path 设为对应路径(例如 CRA 中设"homepage": "/v2/") - 后端 API 若也分版本(如
/api/v1/users),同样适用——路径即语义,也是缓存边界 - 避免用查询参数标版本(如
/app.js?v=2.1.0),它在代理层或 CDN 上可能被忽略或标准化掉
在 Nginx 配置中绑定版本路径与物理目录
用 alias 指令精准映射,避免 root 的路径拼接错误,同时为各版本设置独立缓存策略:
-
location ^~ /v1/ { alias /var/www/app-v1/; }→ 所有/v1/xxx请求落到/var/www/app-v1/xxx -
location ^~ /v2/ { alias /var/www/app-v2/; }→ 同理,物理隔离,互不影响 - 在每个
location块内可加expires或add_header Cache-Control,比如对/v1/static/设 1年缓存,对/v1/index.html禁用缓存
配合符号链接实现零停机更新,不破坏缓存一致性
实际部署时,不要直接覆盖文件,而是让版本目录指向带时间戳或哈希的发布目录,并用软链统一入口:
- 构建产出:/var/www/releases/20260605-v1/、/var/www/releases/20260605-v2/
- 建立软链:
ln -sf /var/www/releases/20260605-v1 /var/www/app-v1 - 更新只需切换软链,旧版本文件保留,已有缓存仍有效;新请求命中新目录,新缓存自然建立
可选:用 map 按请求特征动态选择版本根路径
适用于灰度发布或环境路由(如通过请求头 X-Env: staging 切到测试版):
- 在
http块中定义:map $http_x_env $version_root { "staging" /var/www/app-staging; default /var/www/app-prod; } - 在
location /中写:alias $version_root/;,再配合try_files $uri /index.html; - 注意:这种动态方式会弱化路径级缓存隔离,建议仅用于非核心静态资源或兜底场景











