天天看點

Nginx的緩存機制(Proxy Buffer、Proxy Cache、Proxy Store、Memcached)

Nginx的緩存機制

WEB緩存簡介

Web緩存(或HTTP緩存)是用于臨時存儲(緩存)Web文檔(如HTML頁面和圖像),以減少伺服器延遲的一種資訊技術。Web緩存系統會儲存下通過這套系統的文檔的副本;如果滿足某些條件,則可以由緩存滿足後續請求。 Web緩存系統既可以指裝置,也可以指計算機程式。

Proxy Buffer

Proxy Buffer啟用後,Nginx伺服器會異步地将被代理伺服器的響應資料傳遞給用戶端。

Nginx伺服器首先盡可能地從被代理伺服器那裡接收響應資料,放置在Proxy Buffer中,Buffer的大小由proxy_buffer_size指令和proxy_buffers指令決定。如果在接收過程中,發現Buffer沒有足夠大小來接收一次響應資料時,Nginx伺服器會将部分接收到的資料臨時存放在磁盤的臨時檔案中,磁盤上的臨時檔案路徑由proxy_temp_path指令設定,臨時檔案的大小由proxy_max_temp_file_size指令和proxy_temp_file_write_size指令決定。一次響應資料被接收完成或者Buffer已經裝滿後,Nginx伺服器開始向用戶端傳輸資料。

每個Proxy Buffer裝滿資料後,在從開始向用戶端發送一直到Proxy Buffer中的資料全部傳輸給用戶端的整個過程中,它都處于BUSY狀态,期間對它進行的其他操作都會失敗。同時處于BUSY狀态的Proxy Buffer總大小由proxy_busy_buffers_size指令限制,不能超過該指令設定的大小。

當Proxy Buffer關閉時,Nginx伺服器隻要接收到響應資料就會同步地傳遞給用戶端,它本身不會讀取完整的響應資料。

指令 作用
proxy_buffering on | off 是否啟用Proxy Buffer功能,預設為on(開啟狀态)
proxy_buffers number size 接收一次被代理伺服器響應資料的Proxy Buffer個數和每個Buffer的大小。number=Proxy Bufferr的個數,size=每個Buffer的大小,如:proxy_buffers 8 4k;
proxy_buffer_size size 從被代理伺服器擷取的第一部分響應資料的大小,該資料中一般包含了HTTP響應頭,Nginx伺服器通過它來擷取響應資料和被代理伺服器的一些必要的資訊。size=緩存大小,如:proxy_buffer_size 8k;
proxy_busy_buffers_size size 限制同時處于BUSY狀态的Proxy Buffer的總大小,size=處于BUSY狀态的緩存區總大小,如:proxy_busy_buffers_size 8k
proxy_temp_path path [level1 [level2 [level3]]] 配置磁盤上的一個檔案路徑,該檔案用于臨時存放代理伺服器的大體積響應資料,path=磁盤上存放臨時檔案的路徑,levelN=在path變量設定的路徑下第幾級hash目錄中存放臨時檔案,如:proxy_temp_path /tmp/nginx/proxy_temp 1 2,臨時檔案路徑是/tmp/nginx/proxy_temp/1/10/00000100101
proxy_max_temp_file_size size 用于配置所有臨時檔案的總體積大小,存放在磁盤上的臨時檔案大小不能超過該配置值。size=設定臨時檔案總體積的上限,預設為1024MB
proxy_temp_file_write_size size 用于配置同時寫入臨時檔案的資料量的總大小,合理設定可以避免磁盤IO負載過重,size=同時寫入臨時檔案的資料量總大小

Proxy Cache

指令 作用
proxy_cache zone | off 配置一塊公用的記憶體區域的名稱,該區域可以存放緩存的索引資料。這些資料在Nginx伺服器啟動時由緩存索引重建程序負責建立,在Nginx伺服器的整個運作過程中由緩存管理程序負責定時檢查過期資料、檢索等管理工作,zone=設定的用于存放緩存索引的記憶體區域的名稱,off=關閉proxy_cache功能,預設設定
proxy_cache_bypass string 用于配置Nginx伺服器向用戶端發送響應資料時,不從緩存中擷取的條件。這些條件支援使用Nginx配置的常用變量,string=條件變量,支援設定多個,當至少有一個字元串指令不為空或者不等于0時,響應資料不從緩存中擷取
proxy_cache_key string 用于設定Nginx伺服器在記憶體中為緩存資料建立索引時使用的關鍵字,string=設定的關鍵字,支援變量
proxy_cache_lock on | off 用于設定是否開啟緩存的鎖功能。在緩存中,某些資料項可以同時被多個請求傳回的響應資料填充。開啟該功能後,Nginx伺服器同時隻能有一個請求填充緩存中的某一資料項,這相當于給該資料項上鎖,不允許其他請求操作
proxy_cache_lock_timeout time 用于設定緩存的鎖功能開啟以後鎖的逾時時間,time=設定的時間,預設為5s
proxy_cache_min_uses number 用于設定用戶端請求發送的次數,當用戶端向被代理伺服器發送相同請求達到該指令設定的次數後,Nginx伺服器才對該請求的響應資料做緩存,number=設定的次數,預設為1
proxy_cache_path path [levels=levels] keys_zone=name:size1 [inactive=time1] [max_size=size2] [loader_files=number] [loader_sleep=time2] [loader_threashold=time3] 用于設定Nginx伺服器存儲緩存資料的路徑以及和緩存索引相關的内容,path=設定緩存資料存放的根路徑,levels=設定在相對于path指定目錄的第幾級hash目錄中緩存資料。levels=1,表示一級hash目錄,levels=2,表示兩級,依次類推,name:size1=Nginx伺服器的緩存索引重建程序在記憶體中為緩存資料建立索引,這一對變量用來設定存放緩存索引的記憶體區域的名稱和大小,time1=設定強制更新緩存資料的時間,當硬碟上的緩存資料在設定的時間内沒有被通路時,Nginx伺服器就強制從硬碟上将其删除,下次用戶端通路該資料時重新緩存。該指令預設為10s,size2=設定硬碟中緩存資料的大小限制,number=設定緩存索引重建程序每次加載的資料元素的數量上限,time2=設定緩存索引重建程序在一次周遊結束、下次周遊開始之間的暫停時長,預設設定為50s,time3=設定周遊一次磁盤緩存源資料的時間上限,預設設定為200ms。示例:proxy_cache_path /nginx/cache/a levels=1 keys_zone=a:10m;
proxy_cache_use_stale status 用于設定一些狀态,當後端被代理的伺服器處于這些狀态時,Nginx伺服器啟用該功能,status=為設定的伺服器傳回狀态,可以是一個或者多個,這些狀态有error(在建立連接配接、向被代理的伺服器發送請求或者讀取響應頭時伺服器發生連接配接錯誤)、timeout(在建立連接配接、向被代理的伺服器發送請求或者讀取響應頭時伺服器發生連接配接逾時)、invalid_header(被代理伺服器傳回的響應頭為空或者無效)、http_500|http_502|http_503|http_504|http_404(被代理伺服器傳回500、502、503、504、404狀态代碼)、off(無法将請求發送給被代理伺服器)
proxy_cache_valid [code] time 針對不同的HTTP響應狀态設定不同的緩存時間,code=設定HTTP響應狀态代碼,該指令可選,如果不設定,Nginx伺服器隻為HTTP狀态代碼為200、301和302的響應資料做緩存。可以使用any表示緩存所有該指令中未設定的其他響應資料,time=設定緩存時間,執行個體:proxy_cache_valid 200 302 10m; 對傳回狀态為200和302的響應資料緩存10分鐘
proxy_no_cache string 用于什麼時候不使用cache功能,string=一個或者多個變量,當string值不為空或者不為0時,不啟用cache功能。

注意:Proxy Cache依賴于Proxy Buffer,隻有在Proxy Buffer開啟時才能使用Proxy Cache。

Proxy Buffer和Proxy Cache差別

Proxy Buffer:實作了被代理伺服器響應資料的異步傳輸

Proxy Cache:實作Nginx伺服器對用戶端資料請求的快速響應。

Proxy Store

指令 作用
proxy_store on | off | string 是否在本地磁盤緩存來自被代理伺服器的響應資料,on | off=設定是否開啟Proxy Store功能,緩存檔案會被存放到root或者alias指定的本地路徑下,預設為off(關閉狀态)
proxy_store_access users:permissions 設定使用者或使用者組對Proxy Store緩存的資料的通路權限,users=可以設定為user、group或者all,permission=設定權限,示例:proxy_store_access user:rw group:rw all:r;

Memcached

指令 作用
memcached_pass address memcached伺服器位址,address=memcached伺服器位址,支援IP+端口位址或者域名位址,也可以是upstream指令配置的一個memcached伺服器組
memcached_connect_timeout time 連接配接memcached伺服器的逾時時間,time=逾時時間,預設為60s
memcached_read_timeout time 指Nginx向memcached伺服器發送兩次read請求之間的等待逾時時間,如果在該時間内沒有進行資料傳輸,連接配接将會被關閉,time=逾時時間,預設為60s
memcached_send_timeout time 指Nginx向memcached伺服器發送兩次write請求之間的等待逾時時間,如果在該時間内沒有進行資料傳輸,連接配接将會被關閉,time=逾時時間,預設為60s
memcached_buffer_size size Nginx伺服器用于接收memcached伺服器響應資料的緩存區大小,size=緩存區大小,一般是記憶體頁大小的倍數,執行個體:memcached_buffer_size 4k;
memcached_next_upstream status 在配置了一組memcached伺服器的情況下使用。伺服器組中各memcached伺服器的通路規則遵循upstream指令配置的輪詢規則,同時可以使用該指令配置在發生哪些異常情況時,将請求的順次交由下一個組内伺服器處理,status=為設定的memcached伺服器傳回狀态,可以是一個或者多個,這些狀态有:error(在建立連接配接、向memcached伺服器發送請求或者讀取響應頭時伺服器發生連接配接錯誤)、timeout(在建立連接配接,向memcached伺服器發送請求或者讀取響應頭時伺服器發生連接配接逾時)、invalid_header(memcached伺服器傳回的響應頭為空或者無效)、not_found(memcached伺服器未找到對應的鍵/值對)、off(無法将請求發送給memcached伺服器)