Nginx快取原理及機制

2022-07-03 19:36:07 字數 3312 閱讀 4613

上篇文章介紹了nginx乙個較為重要的知識點:nginx實現介面限流。本篇文章將介紹nginx另乙個重要知識點:nginx快取原理。其實說到快取技術大家應該都不會很陌生,快取技術的基本思想其實是對使用者已經訪問過的內容在nginx建立副本,如果在一段時間內(快取尚未過期)再次訪問該資料,則不需要重新發起請求獲取資料,可以直接從快取中讀取到該資料,好處在於減少了nginx與後端服務之間的網路互動,減輕了網路的壓力,而且在減少資料傳輸的延遲時同時可以提公升使用者訪問速度。而且如果碰上後端服務出現異常時,還可以通過快取進行相應使用者請求,提高了後端服務的穩定性。

什麼是nginx快取?

nginx基於proxy store實現,使用nginx的http_proxy模組可以實現類似於squid的快取功能。當啟用快取時,nginx會將相應資料儲存在磁碟快取中,只要快取資料尚未過期,就會使用快取資料來響應客戶端的請求。

如何啟用快取?

nginx啟用快取需要在最頂層的http節點下配置proxy_cache_path命令。我們先看看proxy_cache_path命令的語法結構:

可以看到proxy_cache_path命令一共包含兩個引數,第乙個引數指定快取儲存的本地路徑,第二個引數定義快取資料的共享記憶體區域的名稱和記憶體區大小。nginx啟動後,快取引導程式只進行載入一次,載入時會將快取的元資料載入到共享記憶體區域,但是如果一次載入整個快取全部內容可能會使nginx剛啟動的前幾分鐘效能消耗嚴重,大幅度降低nginx的效能。所以可以在proxy_cache_path命令中配置快取迭代載入。快取迭代載入一共可以設定三個引數:

在這個例子中快取迭代載入可以持續300毫秒或者直到載入滿200個專案。在http節點下設定完proxy_cache_path命令,下一步在虛擬伺服器配置中配置proxy_cache命令,我們可以看看proxy_cache命令的語法結構:

可以看到proxy_cache命令很簡單,就是指定了我們剛才配置的記憶體區。但是這裡有一點需要額外注意的是:我們剛才通過配置proxy_cache_path命令的keys_zone引數配置記憶體區大小為10m,這並不會限制快取資料的大小,實際上快取資料是儲存在檔案系統中的特定檔案的元資料副本。如果想要限制快取資料的上限,則需要在proxy_cache_path命令中新增max_size引數設定快取資料上限。說完了proxy_cache命令。我們接著看看下乙個命令:proxy_cache_methods,我們看下該命令語法結構:

在虛擬伺服器下配置proxy_cache_methods命令可以指定該虛擬伺服器下什麼型別的http方法可以被快取。預設情況下get請求及head請求會被快取,而post請求不會被快取。接下來看看另外乙個常見的命令:proxy_cache_valid,先貼下該命令語法結構:

這個命令很有意思,在虛擬伺服器下設定該命令,它可以針對不同狀態碼的響應資料設定不同的快取時間,我們可以看個簡單的小例子:

我們通過上面的命令就可以設定200狀態碼的快取時間為10分鐘,302重定向的快取時間為5分鐘,404的快取時間為1分鐘。如果想為所有狀態碼定義相同快取時間,就可以使用any作為第乙個引數:

這個命令可以配置不會向客戶端響應快取,而是直接將請求**給後端服務進行請求資料。可以通過上述命令配置需要繞過快取的請求url,也就是說url中包含該配置的值,則這次請求會直接跳過快取直接請求後端服務去獲取資料。接下來還有最後乙個比較常用的命令:proxy_cache_min_uses。先貼下語法結構:

這個命令可以設定當某請求最少響應幾次後會被快取。若我設定為2則表示每個請求最少被請求2次後會加入到快取中。

nginx清除快取

如果快取過期則需要從快取中刪除過期的快取檔案,防止新舊快取出現交錯出錯,當nginx接收到自定義http頭或者purge請求時,快取將會被清除。

配置快取清除

我們在http節點下建立乙個新變數$purge_method來標識使用purge方法的請求並刪除匹配的url。

}進入虛擬伺服器配置,在location中配置快取記憶體,並且指定快取清除請求命令proxy_cache_purge。

server

}

傳送清除命令配置proxy_cache_purge指令後需要傳送purge請求來清除快取。例如我們使用purge方式請求url:

則getarticle對應的快取中的資料將被刪除。但是,這些高速快取資料不會從快取中完全刪除,它們將保留在磁碟上,直到它們被刪除為非活動狀態,或由快取清除程序處理。

限制ip訪問清除命令

geo $purge_allowed

map $request_method $purge_method

當nginx接收到清除快取請求時,nginx檢查客戶端ip位址,若ip位址已經獲得清除快取許可權,則$purge_method設定為$purge_allowed,值為1表示允許清除快取,值為0表示表示ip位址未獲得許可權。

從快取中完全刪除檔案剛才說過了高速快取資料不會從快取中完全刪除,它們將保留在磁碟上,直到它們被刪除為非活動狀態,或由快取清除程序處理。要完全刪除與getarticle相匹配的快取資料,需要在proxy_cache_path新增引數purger,該引數表示永久的遍歷所有快取條目,並刪除與萬用字元相匹配的條目。

位元組快取可以使用slice命令指定切片大小:

location /

接著將$slice_range變數加入到快取鍵中:使用206狀態**快取響應,快取有效期30m:然後設定range頭傳遞$slice_range變數來將傳遞範圍請求:位元組快取小案例:

location /

快取清除小案例

HTTP快取機制及原理

前言 http 快取機制作為 web 效能優化的重要手段,對於從事 web 開發的同學們來說,應該是知識體系庫中的乙個基礎環節,同時對於有志成為前端架構師的同學來說是必備的知識技能。但是對於很多前端同學來說,僅僅只是知道瀏覽器會對請求的靜態檔案進行快取,但是為什麼被快取,快取是怎樣生效的,卻並不是很...

Http快取機制及原理

http 快取機制作為 web 效能優化的重要手段,但是對於很多前端同學來說,僅僅只是知道瀏覽器會對請求的靜態檔案進行快取,但是為什麼被快取,快取是怎樣生效的,卻並不是很清楚。http報文就是瀏覽器和伺服器間通訊時傳送及響應的資料塊。請求報文 request 和響應報文 response http請...

nginx 快取機制

nginx快取的基本思路 利用請求的區域性性原理,將請求過的內容在本地建立乙個副本,下次訪問時不再連線到後端伺服器,直接響應本地內容 nginx伺服器啟動後,會對本地磁碟上的快取檔案進行掃瞄,在記憶體中建立快取索引,並有專門的程序對快取檔案進行過期判斷 更新等進行管理 對於快取,我們大概會有以下問題...