在 linux 中,nginx 的 alias 指令本身不支持灰度发布,但可以通过结合 map 指令和变量实现基于客户端特征的灰度策略。具体做法是:定义一个 map 块,根据请求头(如 user-agent、x-gray-version)或 ip 设置灰度标记变量;然后在 location 中使用该变量动态拼接路径,指向不同的静态资源目录。

如何基于自定义 Header 实现灰度流量切换
通过 map 匹配请求中的特定 Header 值,将流量分流到不同版本目录。例如,当请求携带 X-Gray-Version: v2 时,指向新版静态资源目录;否则指向旧版。

server {
listen 80;
server_name example.com;
# 定义灰度标记变量
map $http_x_gray_version $gray_dir {
default '/var/www/html/v1';
'v2' '/var/www/html/v2';
}
location /static/ {
alias $gray_dir/static/;
expires 30d;
}
}
预期结果:普通请求返回 /var/www/html/v1/static/ 下的文件;带 X-Gray-Version: v2 的请求返回 /var/www/html/v2/static/ 下的文件。
如何基于 User-Agent 实现移动端灰度
利用 map 匹配 User-Agent 中的关键字,区分移动端与桌面端,分别指向不同版本的静态资源。适用于前端适配不同终端的场景。

server {
listen 80;
server_name example.com;
# 根据 UA 判断是否为移动端
map $http_user_agent $is_mobile {
default 0;
~*Mobile 1;
}
# 根据是否移动端选择目录
map $is_mobile $mobile_dir {
0 '/var/www/html/desktop';
1 '/var/www/html/mobile';
}
location /assets/ {
alias $mobile_dir/assets/;
expires 7d;
}
}
预期结果:桌面浏览器访问 /assets/ 获取桌面版资源;移动设备访问获取移动版资源。
当 Gray Version 未提供时默认行为是什么
当请求未携带 X-Gray-Version 或值不在 map 定义中时,Nginx 会使用 default 分支指定的路径,即默认指向旧版资源目录。这是 map 的默认行为,确保非灰度用户不受影响。











