Random_index模块用于从指定目录随机选取index文件返回,适用于灰度发布等场景;需确认Nginx已启用该模块,配置时启用random_index on并确保目录含多个同级普通文件,配合try_files可实现简易灰度分流。

Random_index 模块是 Nginx 官方提供的一个轻量级模块,用于从指定目录中**随机选取一个 index 文件返回**,常用于灰度发布、A/B 测试或轮播式静态页展示。它本身不支持权重、规则匹配或会话保持,但配合简单策略可实现基础灰度随机效果。
确认模块已启用
Nginx 默认编译时通常已包含 random_index 模块(属于 http_random_index_module),无需额外安装。可通过以下命令验证:
nginx -V 2>&1 | grep -o with-http_random_index_module
若无输出,说明未启用,需重新编译 Nginx 并添加 --with-http_random_index_module 参数。
基础配置:启用随机索引
在 location 块中启用该模块,并确保目录存在且含多个候选模板文件(如 index-a.html、index-b.html、index-c.html):
location / {
root /usr/share/nginx/html/landing;
random_index on; # 启用随机选择
index index.html; # fallback,仅当 random_index 失效时使用
}注意:
- 目录下所有以 . 开头的文件(如 .gitignore)会被自动忽略;
- 只有**同级普通文件**参与随机,子目录不计入;
- 文件名无需固定前缀,但建议统一命名便于管理(如 tmpl-v1.html、tmpl-v2.html)。
模拟灰度:结合 try_files 实现版本分流
Random_index 本身无灰度控制能力,但可通过前置逻辑“干预请求路径”来实现简易灰度。例如:
- 用
map指令基于 IP 或 cookie 生成变量(如$version); - 用
try_files尝试加载指定版本文件,失败则回退到 random_index;
示例配置:
map $cookie_gray_version $tmpl_file {
"v1" "index-v1.html";
"v2" "index-v2.html";
default "";
}
<p>server {
location / {
root /usr/share/nginx/html/landing;</p><pre class="brush:php;toolbar:false;"> # 先尝试按灰度变量加载,命中则直接返回
try_files /$tmpl_file @random_fallback;
# 未命中灰度文件时,进入随机分支
location @random_fallback {
random_index on;
index index.html;
}
}}
这样:带 gray_version=v1 cookie 的用户始终看到 index-v1.html;其他用户则由 random_index 随机分配。
注意事项与限制
不是真正的灰度发布方案:random_index 是纯随机、无状态、无统计、无权重,无法做到 70% 流量导到 A、30% 到 B;
缓存影响明显:若上游有 CDN 或代理缓存了某次随机结果,后续请求可能持续返回同一页面;建议关闭对根路径的强缓存(如 add_header Cache-Control "no-cache";);
文件权限必须可读:Nginx worker 进程需对目标目录及所有候选文件有读取权限,否则随机失败会退回到默认 index 或 403;
不支持正则或通配符过滤:不能只随机 *-exp.html,只能靠文件名约定 + 手动维护目录内容。

















