一、使用場景
- 隨機內容分發
當同一目錄下存放多份等價內容(如多張輪播圖、不同版本靜態頁面等)時,可通過隨機索引實現負載均衡或流量分散。 - A/B 測試
通過目錄請求自動隨機分配用戶到不同測試組,無需后端邏輯參與。 - 動態“首頁”選擇
不同時間或不同訪客展現不同首頁文件,提升新鮮感。
二、示例配置
http {server {listen 80;server_name example.com;# 啟用隨機索引功能location /gallery/ {random_index on;# 如果目錄中沒有文件或模塊被禁用,則回退到默認的 index.htmlindex index.html;}# 其他常見靜態服務配置location /assets/ {alias /var/www/assets/;# 不啟用隨機索引random_index off;index index.html;}}
}
- 當訪問
http://example.com/gallery/
時,模塊會從/gallery/
目錄下隨機挑選一個文件(如01.jpg
、02.jpg
、welcome.html
等)直接返回給客戶端。 - 如果目錄為空或未匹配到任何文件,則繼續執行后續的
index
處理(例如返回index.html
)。
三、指令詳解
Syntax: random_index on | off;
Default: random_index off;
Context: location
參數 | 含義 |
---|---|
on | 在當前 location 塊中啟用隨機索引功能。 |
off | (默認)禁用隨機索引,交由 index 模塊處理。 |
- 作用范圍:僅在指定的
location
塊內生效,可根據目錄或路徑靈活開啟/關閉。 - 執行順序:當
random_index on;
時,模塊在目錄匹配后、index
模塊生效前攔截請求,并嘗試隨機選取目錄內文件;否則,按常規index
規則執行。
四、工作流程
- 請求匹配
匹配到以/
結尾的目錄location
,且該位置啟用了random_index on
。 - 目錄掃描
模塊異步讀取目標目錄的文件列表(忽略子目錄),并構建可供選擇的數組。 - 隨機選取
從列表中隨機挑選一個文件名。 - 內部重寫
將請求 URI 內部重寫為所選文件的相對路徑,并將請求轉交給靜態文件處理流程返回內容。 - 后續處理
如果目錄為空或重寫失敗,則繼續執行后續的index
或autoindex
等指令邏輯。
五、注意事項
-
性能影響
- 目錄掃描開銷:對于文件數量較多的目錄,每次請求均要掃描一次目錄,可能帶來 I/O 開銷。建議結合操作系統緩存和合理的
open_file_cache
配置使用。 - 并發場景:高并發下頻繁掃描同一目錄時,可關閉模塊,改為后臺定期生成隨機化列表或使用內存緩存方案。
- 目錄掃描開銷:對于文件數量較多的目錄,每次請求均要掃描一次目錄,可能帶來 I/O 開銷。建議結合操作系統緩存和合理的
-
文件順序與過濾
- 模塊不會過濾隱藏文件(
.
開頭)或特定后綴;如需更精細控制,可配合location
、try_files
、rewrite
等指令共同使用。
- 模塊不會過濾隱藏文件(
-
回退方案
- 配置
index
或autoindex
以防目錄為空或選取失敗時提供備選內容。
- 配置
六、完整示例
http {# 打開緩存目錄句柄,減少頻繁 open/close 開銷open_file_cache max=1000 inactive=20s;open_file_cache_valid 30s;open_file_cache_min_uses 2;server {listen 80;server_name static.example.com;# 為用戶相冊目錄啟用隨機封面location /albums/ {root /var/www/static;random_index on;# 當目錄為空時返回默認封面index default.jpg;}# 普通靜態文件目錄location /assets/ {root /var/www/static/assets;# 隨機索引無效random_index off;index index.html;}}
}
以上配置中,/albums/
下每個相冊目錄可根據目錄結構隨機返回一張封面圖,其他目錄保持默認靜態服務行為。
通過 ngx_http_random_index_module
,您可以在 Nginx 層面輕松實現“目錄隨機索引”功能,降低后端實現復雜度,快速滿足多種業務需求。