用 map + location + alias 组合实现静态资源版本自动管理,核心是路径映射动态化、版本路由显式化、更新操作原子化:通过 map 按域名或请求头动态绑定环境路径,alias 精准匹配版本前缀路径避免拼接错误,location 顺序控制版本优先级,符号链接实现零停机更新。

用 map + location + alias 组合实现静态资源版本自动管理,是目前最清晰、安全且无需 reload 的方案。核心在于路径映射动态化、版本路由显式化、更新操作原子化。
用 map 动态绑定环境与物理路径
在 http 块中定义映射规则,把请求特征(如域名、请求头)转为变量,避免硬编码或 if 判断:
- 按域名区分:dev.example.com →
/var/www/app/dev/,prod.example.com →/var/www/app/prod/ - 按请求头区分:
X-Env: staging→/var/www/app/staging/ - 所有分支必须覆盖,否则未匹配时变量为空,导致 404;路径必须是合法绝对路径
用 alias 精准匹配带版本号的路径
对含版本前缀的请求(如 /v2/assets/),必须用 alias,不能用 root:
-
location ^~ /v2/ { alias $env_root/v2/; }→ 请求/v2/js/app.js直接落到$env_root/v2/js/app.js - 若误用
root $env_root; location /v2/,会拼成$env_root/v2/v2/js/app.js,路径错误 -
^~前缀确保最长前缀匹配优先于正则,适合版本路由
分层 location 控制版本优先级
把高优先级版本放在前面,利用 Nginx 自然匹配顺序分流:
-
location ^~ /v3/ { alias $env_root/v3/; }→ 所有/v3/xxx请求走 v3 -
location ^~ /v2/ { alias $env_root/v2/; }→ 次之 -
location / { root $env_root/latest/; }→ 默认兜底,指向符号链接或当前稳定版目录
用符号链接实现零停机更新
让 $env_root/latest 或各版本路径实际指向具体发布目录:
/var/www/app/latest → /var/www/app/releases/20260628/- 上线新版时只改软链目标,Nginx 不 reload 即可生效
- 构建脚本可自动创建新目录、更新软链、清理旧版本











