1. 程式人生 > >Nginx快取原理及機制

Nginx快取原理及機制

文章原創於公眾號:程式猿周先森。本平臺不定時更新,喜歡我的文章,歡迎關注我的微信公眾號。

上篇文章介紹了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 /data/cache keys_zone=niyueling:10m;

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

  • loader_threshold - 迭代的持續時間,以毫秒為單位(預設為200)
  • loader_files - 在一次迭代期間載入的最大專案數(預設為100)
  • loader_sleeps - 迭代之間的延遲(以毫秒為單位)(預設為50)

我們可以看下一個小例子:

  • proxy_cache_path /data/cache keys_zone=niyueling:10m loader_threshold=300 loader_files=200;

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

  • proxy_cache niyueling;

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

  • proxy_cache_methods[GET HEAD POST];

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

  • proxy_cache_valid reply_code [reply_code...] time;

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

  • proxy_cache_valid 200 10m ;
  • proxy_cache_valid 404 1m ;
  • proxy_cache_valid 302 5m ;

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

  • proxy_cache_valid any 5m;

接下來看看下一個命令:proxy_cache_bypass。一樣先看下語法結構:

  • proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;

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

  • proxy_cache_min_uses 2;

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

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

配置快取清除
我們在HTTP節點下建立一個新變數$purge_method來標識使用PURGE方法的請求並刪除匹配的URL。

http {
map $request_method $purge_method {
PURGE 1;
default 0;
}
}

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

server {
listen 80;
server_name www.niyueling.cn;
location / {
proxy_cache niyueling;
proxy_cache_purge $purge_method;
}
}

傳送清除命令

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

  • PURGE www.niyueling.cn/getArticle

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

限制IP訪問清除命令

清除快取這種命令一般需要許可權才可進行操作,所以我們一般需要配置允許傳送快取清除請求的IP地址:

geo $purge_allowed {
default 0;
49.235.28.88 1;
192.168.1.100/24 1;
}
map $request_method $purge_method {
PURGE $purge_allowed;
default 0;
}
當Nginx接收到清除快取請求時,Nginx檢查客戶端IP地址,若IP地址已經獲得清除快取許可權,則$purge_method設定為$purge_allowed,值為1表示允許清除快取,值為0表示表示IP地址未獲得許可權。

從快取中完全刪除檔案

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

  • proxy_cache_path /data/cache keys_zone=niyueling:10m purger=on;

位元組快取
當我們請求一個大檔案時,因為請求比較耗時,當有下一個請求來臨時將不得不等待整個大檔案被下載並放入快取記憶體。Nginx用快取片模組填充快取記憶體。可以將大檔案分為較小的切片,每個範圍請求選擇將覆蓋所請求範圍的特定切片,並且如果此範圍切片仍未快取,就將其放入快取中。啟用位元組範圍快取需要注意兩個條件是否滿足:

  • 確保Nginx是使用模組編譯的。
  • 使用slice指令指定切片的大小。

可以使用slice命令指定切片大小:

location / {
slice 1m;
}

使用slice指令指定切片大小時應注意切片大小應適當調整,使切片快速下載。因為切片大小指定太小可能會導致記憶體使用量過多和大量開啟的檔案描述符,切片大小指定太大的值可能會導致請求延遲。

接著將$slice_range變數加入到快取鍵中:

  • proxy_cache_key $uri$is_args$args$slice_range;

使用206狀態程式碼快取響應,快取有效期30m:

  • proxy_cache_valid 206 30m;

然後設定Range頭傳遞$slice_range變數來將傳遞範圍請求:

  • proxy_set_header Range $slice_range;

位元組快取小案例:

location / {
slice 1m;
proxy_cache niyueling;
proxy_cache_key $uri$is_args$args$slice_range;
proxy_set_header Range $slice_range;
proxy_cache_valid 206 30m;
}

快取清除小案例

http {
proxy_cache_path /data/cache keys_zone=niyueling:10m purger=on;
map $request_method $purge_method {
PURGE 1;
default 0;
}

server {
listen 80;
server_name www.niyueling.cn;
location / {
proxy_cache niyueling;
proxy_cache_purge $purge_method;
}
}

geo $purge_allowed {
default 0;
49.235.28.88 1;
192.168.1.100/24 1;
}

map $request_method $purge_method {
PURGE $purge_allowed;
default 0;
}
}

如果喜歡我的文章,歡迎關注公眾號:程式猿周先森。

相關推薦

Nginx快取原理機制

文章原創於公眾號:程式猿周先森。本平臺不定時更新,喜歡我的文章,歡迎關注我的微信公眾號。 上篇文章介紹了Nginx一個較為重要的知識點:Nginx實現介面限流。本篇文章將介紹Nginx另一個重要知識點:Nginx快取原理。其實說到快取技術大家應該都不會很陌生,快取技術的基本思想其實是對使用者已經訪問過的內

Nginx快取原理配置

1.Nginx的快取簡介nginx的http_proxy模組,可以實現類似於Squid的快取功能。Nginx對客戶已經訪問過的內容在Nginx伺服器本地建立副本,這樣在一段時間內再次訪問該資料,就不需要通過Nginx伺服器再次向後端伺服器發出請求,所以能夠減少Nginx伺服器

三分鐘看懂Nginx伺服器的快取原理機制

作者:LifeIsButA_Span 來源: http://blog.csdn.net/lifeisbuta_span/article/details/70598586 Nginx伺服器的快取原理,是在學習過程中比較重要的一個知識點,學習通透之後,對於自己的

nginx負載均衡、nginx ssl原理生成密鑰對、nginx配制ssl

alt self. 加密傳輸 remote cat nginx ssl 之間 PE www. 1、nginx負載均衡 新建一個文件:vim /usr/local/nginx/conf/vhost/load.conf寫入: upstream abc_com{ ip_ha

Nginx工作原理相關介紹

handle 利用 ice fff 高並發 解析器 異常 creat 為什麽 Nginx工作原理及相關介紹一、Nginx工作原理與模塊介紹1、Nginx基本工作原理NGINX以高性能的負載均衡器,緩存,和web服務器聞名。Nginx由內核和模塊組成,其中,內核的設計非常微小

Nginx快取配置nginx ngx_cache_purge模組的使用

ngx_cache_purge模組的作用:用於清除指定url的快取 1、編譯如下: # ./configure --prefix=/app/nginx --with-http_stub_status_module --with-http_ssl_module --

快取原理優缺點

原理:先查詢快取中有沒有要的資料,如果有,就直接返回快取中的資料。如果快取中沒有要的資料,才去查詢資料庫,將得到資料先存放到快取中,然後再返回給php。優點: 1、 減少了對資料庫的讀操作,資料庫的壓力降低  2、 加快了響應速度  缺點: 1、 因為記憶體斷電就清空資料,

nginx快取配置開啟gzip壓縮

閱讀目錄 一:nginx快取配置 二:nginx開啟gzip 回到頂部 一:nginx快取配置 在前一篇文章,我們理解過http快取相關的知識點, 請看這篇文章. 今天我們來學習下使用nginx服務來配置快取的相關的知識。 nginx配置快取的優點:可以在一定程度上,減少伺服器的處

梳理hibernate篇-原理快取機制

Hibernate工作原理  本文出自: http://www.cnblogs.com/bile/p/4030575.html  現在我們知道了一個概念Hibernate Session,只有處於Session管理下的POJO才具有持久化操作能力。當應用程式對於處於Sessi

Struts2漏洞利用原理OGNL機制

基本 conf 數據集 fig 然而 example 所有 def 字符串類型 Struts2漏洞利用原理及OGNL機制研究 概述 在MVC開發框架中,數據會在MVC各個模塊中進行流轉。而這種流轉,也就會面臨一些困境,就是由於數據在不同MVC層次中表現出不同的形式和狀態

inotify機制監控文件系統事件原理使用

direct esc his 存儲 cname smo gin related oca 1.基本描述 inotify提供了一種監控文件系統事件的機制,可以用來監控單個的文件以及目錄。當一個目錄被監控,inotify會返回該目錄以及該目錄下面文件的事件。 2.原理以及使用 2

uWSGI+django+nginx部署流程原理

在進行部署的時候不知道走了多少坑。走通過後才發現原來也就是那麼回事,說難也不難,說簡單也確實有很多坑。 部署環境 系統:Centos7 Python: python3.6.5 Django:Django2.1 web伺服器:Nginx 應用程式伺服器:uWSGI 一、

Java核心機制:反射機制原理應用方法

一、java的核心機制 java有兩種核心機制:java虛擬機器(JavaVirtual Machine)與垃圾收集機制(Garbage collection): 1、Java虛擬機器:是執行所有Java程式的抽象計算機,是Java語言的執行環境,在其上面執行Java程式碼編譯後的位元組碼程式,

java垃圾回收機制原理優缺點

  優點:a.不需要考慮記憶體管理, b.可以有效的防止記憶體洩漏,有效的利用可使用的記憶體, c.由於有垃圾回收機制,Java中的物件不再有"作用域"的概念,只有物件的引用才有"作用域" 原

Java反射機制原理在Android下的簡單應用

package crazypebble.reflectiontest;import java.lang.reflect.Constructor;import java.lang.reflect.Method;publicclass LoadMethod { /** * 在執行時載入指定的類,並呼

區塊鏈:講故事告訴你比特幣的原理運作機制

一個故事告訴你比特幣的原理及運作機制推薦:週末花時間看了一些比特幣原理相關的資料,雖然不敢說把每個細節都完全搞懂了,不過整體思路和關鍵部分的主要原理還是比較明白。寫一篇文章分享給大家。這篇文章的定位會比較科普,儘量用類比的方法將比特幣的基本原理講出來。這篇文章不會涉及演算法和

YARN框架原理執行機制

  YARN是Hadoop2.0中的資源管理系統,它的設計思想是將MRv1中的JobTracker拆分成兩個獨立的服務:一個全域性的資源管理器ResourceManager和每個應用程式持有的ApplicationMaster。其中RM負責整個系統的資源管理和分配,AM負責單個應用程式的管理。 一、YARN

POW共識機制原理優缺點

PoW共識機制 POW工作量證明(英文全稱為Proof of Work)在比特幣之前就已經出現,中本聰在設計區塊鏈的共識機制的時候就是借鑑了POW工作量證明。常見的是利用HASH運算的複雜度進行CPU運算實現工作量確定。 定義 工作量證明(Proof-of-W

Java集合-05fail-fast(快速失敗)機制原理解決方法

fail-fast簡介 fail-fast(快速失敗),是Java集合的一種錯誤檢測機制。當在遍歷集合的過程中該集合在結構(改變集合大小)上發生變化時候, 有可能發生fail-fast,丟擲java.util.ConcurrentModificationException異常。 fail-fas

一個故事告訴你比特幣的原理運作機制

問題的提出 比特幣產生的動機 以物易物 話說在這個世界上,有一個叫位元村的小村莊,村莊共有幾百戶人家。這個村莊幾乎與世隔絕,過著自給自足的生活。由於沒有大規模貿易,位元村村民一直過著以物易物的生活,也就是說村民之間並沒有使用統一的貨幣,互相間的貿易基本上就是老張家拿一袋