《Nginx核心知識100講》slice模組:用分片提升快取效率
極客專欄《Nginx核心知識100講》107小節,筆記
注意:這個是看專欄視訊,敲的哈。這個專欄讓我收貨蠻大的。
107 | 用分片提升快取效率
當適用nginx作為反向代理並且快取上游的響應時,如果上游的響應檔案特別大。nginx處理這麼大的響應時,效率就比較低下了。特別是有多個請求同時併發的打到一個暫時沒有快取的大檔案時,效能非常成問題。
nginx官方模組提供了一個slice的模組可以通過range協議把一個很大的響應分解成很多小的響應來提升服務效能。
slice模組

image.png
slice:為0的時候表示禁用。如果不為0,把大響應分解成多個小檔案獨立的快取。
執行流程

image.png
第一步:客戶端請求100個位元組,起始於150,也就是range是150 249。發到nginx後,nginx根據slice的配置,比如slice配置為100,也就是從0 100,100 200,200 300,切成了三塊。檔案有多大就切成多塊。
第二步:nginx在第二部構造出兩個請求。這裡先發一個100 199,再發一個200 299。
第三步:第二步的兩個請求返回之後,會生成兩個檔案。一個是slice 100 199,一個是200 299。
第四部:再把第三步的,組合起來生成客戶端要的響應。
一個場景:訪問一個大檔案
代理配置

image.png
上游配置
我沒看到沒有其他配置。只是請求一個視訊檔案。

image.png

image.png
去訪問video的10個位元組

image.png
確實返回了10個位元組。我們看上游返回了多少個位元組。

image.png
上游缺返回了完整的視訊。這是nginx所做的優化。你只是訪問了一個大檔案的range 其中的一小部分。但nginx考慮到如果一次向上遊獲取到整個響應的內容。後續再訪問其他的位元組,就可以使用我的快取。這只是一種場景。
如果說我們的服務是併發的。同時有多個客戶併發的訪問其中某一塊的話。就會引發很嚴重的問題。很多請求都去訪問巨大的檔案了。這時候slice模組就有了用武之地。
slice模組的使用
使用slice模組需要配置三個地方

image.png
slice 後面跟單位,也就是分為多大的大小進行切分。如果分的小的話就會造成很多檔案。如果分的大的話,效果就不明顯。
proxy_cache_key 後面一定要加上$slice_range,這樣我們才知道,比如說100~199位元組。
proxy_set_header 配置Range頭部,記得頭部是發到上游的。發向上游按1MB一個單位開始發。
再次請求視訊。

image.png
看看這次上游日誌中的記錄。

image.png
我們發現只有1MB。就是我們配置的。slice就是這麼起作用的。
當我們的上游返回巨大的檔案的時候,使用slice可以針對,如果客戶端使用斷點續傳,多執行緒下載等等含有range協議的場景時,slice是非常有用的。