零基礎弄懂 ngx_http_slice_module分片緩存加速

一、為什么需要 Slice?

在 NGINX 反向代理或 CDN 場景中,大文件(視頻、軟件包、鏡像等)常因單體體積過大而令緩存命中率低、回源代價高。
ngx_http_slice_module 通過把一次完整響應拆分成 固定大小的字節塊(Slice),讓各塊分別緩存,從而帶來三大收益:

  1. 更高緩存命中率

    • 客戶端斷點續傳、并發 Range 請求只命中需要的分片,無須整文件回源。
  2. 回源壓力小

    • 回源服務器可串流輸出,對下游節點按塊供給,避免一次性讀取整文件。
  3. 快速失敗與熱區

    • 若分片出現損壞或更新,僅重拉對應 Slice,其他分片繼續復用緩存。

二、模塊啟用

ngx_http_slice_module 默認未編譯。必須在編譯 NGINX 時加入:

./configure --with-http_slice_module  \--with-http_ssl_module   # 其他模塊
make && sudo make install

驗證是否編譯成功:

nginx -V 2>&1 | grep --color http_slice

三、核心概念

名稱說明
Slice一個固定大小的字節塊(例如 1 MiB),每個塊通過子請求(subrequest)回源并緩存。
$slice_range模塊自動生成的變量,格式形如 bytes=0-1048575,指明本子請求需要的區間;需作為 Range 頭傳遞給上游。
狀態碼 206分片請求回源時,上游需返回 206 Partial Content 并帶 Content-Range,NGINX 緩存到本地。
子請求 (subrequest)NGINX 在后臺對每個 Slice 發起獨立請求;與 proxy_cache_background_update 等子請求并存時有已知問題(見后文)。

四、最小可用配置(一步一步)

假設:

  • 回源服務 http://localhost:8000/ 存放大文件;
  • 目標:把每個響應切成 1 MiB 切片并緩存。
http {proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=cache:100m inactive=1h;server {listen 80;location / {# 1. 開啟分片,單位可用 k/m/gslice 1m;# 2. 啟用緩存proxy_cache       cache;proxy_cache_valid 200 206 1h;# 3. 把分片區間加入緩存 key,保證不同片段獨立緩存proxy_cache_key   $uri$is_args$args$slice_range;# 4. 告訴回源取哪段字節proxy_set_header  Range $slice_range;# 5. 回源proxy_pass        http://localhost:8000;}}
}

流程說明:

  1. 首個請求 → NGINX 判斷需切片,先取 slice=0~1048575
  2. cache miss → 向回源帶 Range: bytes=0-1048575,獲得 206,緩存。
  3. 后續切片 → 繼續子請求;未命中則回源、命中則直返。
  4. 客戶端端網速變化 → 支持斷點續傳;若斷線后重連,只拉缺失部分,命中率高。

五、可調指令

5.1 slice size;

  • size:每片大小,可寫 256k | 1m | 4m 等;

  • 0(默認)關閉切片。

  • 建議

    • 小文件 < size -> 不切片;
    • 過小會導致文件句柄過多,過大會降低命中率,常用 512 k ~ 2 m

5.2 $slice_range

無需顯式定義,模塊自動按 slice 和當前偏移生成。例如:

bytes=1048576-2097151

務必用 proxy_set_header Range $slice_range 傳遞給上游。

六、進階技巧

6.1 HTTPS 回源 + Range

若回源是 HTTPS,上游同樣須支持分段下載;否則 NGINX 會回退整文件。

proxy_pass https://backend.example.com;
proxy_set_header Range $slice_range;

6.2 限制并發子請求

過多并發會給回源帶來壓力,可在 proxy_cache_lock / limit_conn 等模塊配合限流。

proxy_cache_lock on;             # 只有首個分片回源,其余等待,防止擊穿
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn perip 10;             # 每 IP 最多 10 并發

6.3 與 Range/Head 兼容

客戶端自己發 Range(斷點續傳)時,Slice 會在原有 Range 內繼續切分,返回多片合并結果,對客戶端透明。

6.4 NJS 動態調整 Slice

可用 set $slice_size ... + slice $slice_size; 按不同 URI / MIME 策略動態調整分片大小。

七、已知問題與避坑

場景問題表現解決建議
Background Cache Update使用 proxy_cache_background_update on; 時,不支持 Range,可能整文件回源避免在同一 location 打開該特性;或使用主動刷新腳本
過小 Slice (<32k)fd 數暴增、內存占用高Slice ≥ 256k;確保 worker_rlimit_nofile 足夠
回源不支持 Range上游返回 200 整文件,Slice 無意義確認回源支持 Accept-Ranges: bytes headers
ETag 變化不同分片用不同 ETag 導致緩存擊穿統一回源 ETag 或禁用 proxy_ignore_headers ETag;

八、監控 & 調試

  • 查看緩存ls -l /data/nginx/cache,每片生成獨立緩存文件。
  • 日志標記:在 log_format 中加入 $slice_range$upstream_status 便于排查:
log_format  slice  '$remote_addr $uri $status ''range=$slice_range up=$upstream_status';
access_log  /var/log/nginx/slice.log slice;
  • 性能指標

    • proxy_cache_hit, miss
    • connections_active, reading, writing
    • 磁盤 IO

九、場景實戰

9.1 大文件下載(ISO、固件)

slice 2m;                           # 較大分片減少文件數
proxy_cache_valid 200 206 12h;      # 長時間緩存

9.2 HLS/DASH 點播

分片文件本就小,可關閉切片,或僅對 .mp4 大文件切片:

location ~ \.mp4$ {slice 1m;...
}

9.3 鏡像倉庫代理

鏡像層 (layer) 可達數百 MB,開啟切片后可極大提高復用率。

十、總結

  • 一句話ngx_http_slice_module 通過“分片 + 緩存”讓大文件交付更高效。

  • 必做

    1. 編譯開啟 --with-http_slice_module
    2. 設置 slice 大小 + 緩存 key 中加入 $slice_range
    3. $slice_range 作為 Range 頭傳遞
    4. 緩存中允許狀態碼 206
  • 可選:結合 proxy_cache_locklimit_conn、自定義 session_log 等做進一步優化。

掌握上述配置與注意事項后,你就可以讓 NGINX 在大文件分發、CDN 邊緣緩存、鏡像倉庫等場景下發揮極致性能,顯著降低回源壓力與帶寬消耗。祝你使用順利,緩存命中率節節攀升!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82401.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82401.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82401.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

機器人強化學習入門學習筆記(三)

強化學習&#xff08;Reinforcement Learning, RL&#xff09;與監督學習不同——你不需要預先準備訓練數據集&#xff0c;而是要設計環境、獎勵函數&#xff0c;讓智能體通過交互不斷探索和學習。 &#x1f3af; 一、強化學習和訓練數據的關系 強化學習不依賴固定的數據集。它…

【python實戰】二手房房價數據分析與預測

個人主頁&#xff1a;大數據蟒行探索者 目錄 一、數據分析目標與任務 1.1背景介紹 1.2課程設計目標與任務 1.3研究方法與技術路線 二、數據預處理 2.1數據說明 2.2數據清洗 2.3數據處理 三、數據探索分析 四、數據分析模型 五、方案評估 摘要&#xff1a;隨著社會經…

Kotlin IR編譯器插件開發指南

在 Kotlin 中開發基于 IR&#xff08;Intermediate Representation&#xff09;的編譯器插件&#xff0c;可以深度定制語言功能或實現高級代碼轉換。以下是分步驟指南&#xff1a; 一、IR 編譯器插件基礎 IR 是什么&#xff1f; Kotlin 編譯器將源碼轉換為 IR 中間表示&#xf…

如何用 python 代碼復現 MATLAB simulink 的 PID

MATLAB在 Simulink 里做以下設置MATLAB 腳本調用示例 python 實現離散 PID 實現&#xff08;并行形式&#xff09; Simulink 中兩種 PID 結構&#xff08;并聯形式, I-形式&#xff09;下連續/離散時域里積分增益 I 的表示并聯&#xff08;Parallel&#xff09; vs 理想&#x…

黑馬點評--基于Redis實現共享session登錄

集群的session共享問題分析 session共享問題&#xff1a;多臺Tomcat無法共享session存儲空間&#xff0c;當請求切換到不同Tomcat服務時&#xff0c;原來存儲在一臺Tomcat服務中的數據&#xff0c;在其他Tomcat中是看不到的&#xff0c;這就導致了導致數據丟失的問題。 雖然系…

SkyWalking啟動失敗:OpenSearch分片數量達到上限的完美解決方案

?? 問題現象 SkyWalking OAP服務啟動時報錯: org.apache.skywalking.oap.server.library.module.ModuleStartException: java.lang.RuntimeException: {"error":{"root_cause":[{"type":"validation_exception", "reason&q…

向量數據庫選型實戰指南:Milvus架構深度解析與技術對比

導讀&#xff1a;隨著大語言模型和AI應用的快速普及&#xff0c;傳統數據庫在處理高維向量數據時面臨的性能瓶頸日益凸顯。當文檔經過嵌入模型處理生成768到1536維的向量后&#xff0c;傳統B-Tree索引的檢索效率會出現顯著下降&#xff0c;而現代應用對毫秒級響應的嚴苛要求使得…

MySQL#秘籍#一條SQL語句執行時間以及資源分析

背景 一條 SQL 語句的執行完&#xff0c;每個模塊耗時&#xff0c;不同資源(CPU/IO/IPC/SWAP)消耗情況我該如何知道呢&#xff1f;別慌俺有 - MySQL profiling 1. SQL語句執行前 - 開啟profiling -- profiling (0-關閉 1-開啟) -- 或者&#xff1a;show variables like prof…

【數據結構】實現方式、應用場景與優缺點的系統總結

以下是編程中常見的數據結構及其實現方式、應用場景與優缺點的系統總結&#xff1a; 一、線性數據結構 1. 數組 (Array) 定義&#xff1a;連續內存空間存儲相同類型元素。實現方式&#xff1a;int[] arr new int[10]; // Javaarr [0] * 10 # Python操作&#xff1a; 訪問&…

PyTorch中cdist和sum函數使用示例詳解

以下是PyTorch中cdist與sum函數的聯合使用詳解: 1. cdist函數解析 功能:計算兩個張量間的成對距離矩陣 輸入格式: X1:形狀為(B, P, M)的張量X2:形狀為(B, R, M)的張量p:距離類型(默認2表示歐式距離)輸出:形狀為(B, P, R)的距離矩陣,其中元素 d i j d_{ij} dij?表示…

Ansible配置文件常用選項詳解

Ansible 的配置文件采用 INI 格式&#xff0c;分為多個模塊&#xff0c;每個模塊包含特定功能的配置參數。 以下是ansible.cfg配置文件中對各部分的詳細解析&#xff1a; [defaults]&#xff08;全局默認配置&#xff09; inventory 指定主機清單文件路徑&#xff0c;默認值為 …

了解FTP搜索引擎

根據資料&#xff0c; FTP搜索引擎是專門搜集匿名FTP服務器提供的目錄列表&#xff0c;并向用戶提供文件信息的網站&#xff1b; FTP搜索引擎專門針對FTP服務器上的文件進行搜索&#xff1b; 就是它的搜索結果是一些FTP資源&#xff1b; 知名的FTP搜索引擎如下&#xff0c; …

【大模型面試每日一題】Day 28:AdamW 相比 Adam 的核心改進是什么?

【大模型面試每日一題】Day 28&#xff1a;AdamW 相比 Adam 的核心改進是什么&#xff1f; &#x1f4cc; 題目重現 &#x1f31f;&#x1f31f; 面試官&#xff1a;AdamW 相比 Adam 的核心改進是什么&#xff1f; #mermaid-svg-BJoVHwvOm7TY1VkZ {font-family:"trebuch…

C++系統IO

C系統IO 頭文件的使用 1.使用系統IO必須包含相應的頭文件&#xff0c;通常使用#include預處理指令。 2.頭文件中包含了若干變量的聲明&#xff0c;用于實現系統IO。 3.頭文件的引用方式有雙引號和尖括號兩種&#xff0c;區別在于查找路徑的不同。 4.C標準庫提供的頭文件通常沒…

多模態理解大模型高性能優化丨前沿多模態模型開發與應用實戰第七期

一、引言 在前序課程中&#xff0c;我們系統剖析了多模態理解大模型&#xff08;Qwen2.5-VL、DeepSeek-VL2&#xff09;的架構設計。鑒于此類模型訓練需消耗千卡級算力與TB級數據&#xff0c;實際應用中絕大多數的用戶場景均圍繞推理部署展開&#xff0c;模型推理的效率影響著…

各個網絡協議的依賴關系

網絡協議的依賴關系 學習網絡協議之間的依賴關系具有多方面重要作用&#xff0c;具體如下&#xff1a; 幫助理解網絡工作原理 - 整體流程明晰&#xff1a;網絡協議分層且相互依賴&#xff0c;如TCP/IP協議族&#xff0c;應用層協議依賴傳輸層的TCP或UDP協議來傳輸數據&#…

11.8 LangGraph生產級AI Agent開發:從節點定義到高并發架構的終極指南

使用 LangGraph 構建生產級 AI Agent:LangGraph 節點與邊的實現 關鍵詞:LangGraph 節點定義, 條件邊實現, 狀態管理, 多會話控制, 生產級 Agent 架構 1. LangGraph 核心設計解析 LangGraph 通過圖結構抽象復雜 AI 工作流,其核心要素構成如下表所示: 組件作用描述代碼對應…

相機--基礎

在機器人開發領域&#xff0c;相機種類很多&#xff0c;作為一個機器人領域的開發人員&#xff0c;我們需要清楚幾個問題&#xff1a; 1&#xff0c;相機的種類有哪些&#xff1f; 2&#xff0c;各種相機的功能&#xff0c;使用場景&#xff1f; 3&#xff0c;需要使用的相機…

【備忘】 windows 11安裝 AdGuardHome,實現開機自啟,使用 DoH

windows 11安裝 AdGuardHome&#xff0c;實現開機自啟&#xff0c;使用 DoH 下載 AdGuardHome解壓 AdGuardHome啟動 AdGuard Home設置 AdGuardHome設置開機自啟安裝 NSSM設置開機自啟重啟電腦后我們可以訪問 **http://127.0.0.1/** 設置使用 AdGuardHome DNS 效果圖 下載 AdGua…

安裝部署配置jenkins

隨著現代軟件開發流程的不斷演進,持續集成(CI)和持續交付(CD)已經成為了開發團隊必不可少的工具。而Jenkins作為最為廣泛應用的CI/CD工具,能夠自動化執行構建、測試、部署等任務。Maven作為Java生態中廣泛使用的構建工具,它能夠幫助開發人員自動化管理項目的構建、依賴和…