溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Nginx代理緩存配置技巧有哪些

發(fā)布時(shí)間:2021-08-20 14:26:46 來源:億速云 閱讀:256 作者:小新 欄目:服務(wù)器

這篇文章將為大家詳細(xì)講解有關(guān)Nginx代理緩存配置技巧有哪些,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

概覽

內(nèi)容緩存位于客戶端和源服務(wù)器 (upstream) 之間,并保存它看到的所有內(nèi)容的副本。如果客戶端請求緩存已存儲的內(nèi)容,則它會直接返回內(nèi)容而不連接源服務(wù)器。這提高了性能,因?yàn)閮?nèi)容緩存更靠近客戶端,并且更有效地使用應(yīng)用程序服務(wù)器,因?yàn)樗鼈儾槐孛看味紡念^開始生成頁面。

Web 瀏覽器和應(yīng)用程序服務(wù)器之間可能存在多個(gè)緩存:客戶端的瀏覽器緩存,中間緩存,內(nèi)容交付網(wǎng)絡(luò)(CDN)以及位于應(yīng)用程序服務(wù)器前面的負(fù)載平衡器或反向代理。即使在反向代理/負(fù)載均衡器級別,緩存也可以極大地提高性能。

這里舉一個(gè)例子,比如我的站點(diǎn)使用 Next.js 服務(wù)器端口渲染,由于服務(wù)器性能比較差,當(dāng)然 $5 的服務(wù)器,并不能期望好到那里去,能用就已經(jīng)非常了不起,能進(jìn)入這個(gè)局域網(wǎng)就好了,別期望太多。

每次打開頁面將近花費(fèi) 7 秒左右,當(dāng)這其中包含網(wǎng)絡(luò)延遲,但當(dāng)我直接在服務(wù)器端(127.0.0.1) 發(fā)起請求時(shí),時(shí)間接近 5 秒,然后再排除從數(shù)據(jù)庫獲取數(shù)據(jù)時(shí)間,服務(wù)器端渲染時(shí)間用了 4.5 秒,實(shí)在太慢,此時(shí)我能想到最快解決問題答案就是緩存,但在那里加入緩存,從每一步時(shí)間看來,在 Nginx 加入緩存最快解決問題

Nginx 通常作為應(yīng)用程序堆棧中的反向代理或負(fù)載平衡器部署,并具有一整套緩存功能。下面我們將討論如何使用 Nginx 配置基本緩存。

如何設(shè)置和配置基本緩存

只需要兩個(gè)指令即可啟用基本緩存:proxy_cache_path 和 proxy_cache。

proxy_cache_path 指令設(shè)置緩存的路徑和配置,proxy_cache 用來指令激活它。

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g 
         inactive=60m use_temp_path=off; 
 
 
server { 
  # ... 
  location / { 
    proxy_cache my_cache; 
    proxy_pass http://my_upstream; 
  } 
}

proxy_cache_path 指令的參數(shù)定義了以下設(shè)置:

緩存的本地磁盤目錄稱為 /path/to/cache/。

  • levels 在/path/to/cache/ 下設(shè)置一個(gè)兩級目錄層次結(jié)構(gòu)。在單個(gè)目錄中包含大量文件會降低文件訪問速度,因此我們建議對大多數(shù)部署使用兩級目錄層次結(jié)構(gòu)。如果 levels 未包含該參數(shù),Nginx 會將所有文件放在同一目錄中。

  • keys_zone 設(shè)置共享內(nèi)存區(qū)域,用于存儲緩存鍵和元數(shù)據(jù),例如使用計(jì)時(shí)器。擁有內(nèi)存中的密鑰副本,Nginx 可以快速確定請求是否是一個(gè) HIT 或 MISS 不必轉(zhuǎn)到磁盤,從而大大加快了檢查速度。1 MB 區(qū)域可以存儲大約 8,000 個(gè)密鑰的數(shù)據(jù),因此示例中配置的 10 MB 區(qū)域可以存儲大約 80,000 個(gè)密鑰的數(shù)據(jù)。

  • max_size 設(shè)置緩存大小的上限(在本例中為 10 千兆字節(jié))。它是可選的; 不指定值允許緩存增長以使用所有可用磁盤空間。當(dāng)緩存大小達(dá)到限制時(shí),一個(gè)稱為緩存管理器的進(jìn)程將刪除最近最少使用的緩存,將大小恢復(fù)到限制之下的文件。

  • inactive 指定項(xiàng)目在未被訪問的情況下可以保留在緩存中的時(shí)間長度。在此示例中,緩存管理器進(jìn)程會自動(dòng)從緩存中刪除 60 分鐘未請求的文件,無論其是否已過期。默認(rèn)值為 10 分鐘(10m)。非活動(dòng)內(nèi)容與過期內(nèi)容不同。Nginx 不會自動(dòng)刪除緩存 header 定義為已過期內(nèi)容(例如 Cache-Control:max-age=120)。過期(陳舊)內(nèi)容僅在指定時(shí)間內(nèi)未被訪問時(shí)被刪除。訪問過期內(nèi)容時(shí),Nginx 會從原始服務(wù)器刷新它并重置 inactive 計(jì)時(shí)器。

  • Nginx 首先將發(fā)往高速緩存的文件寫入臨時(shí)存儲區(qū)域,use_temp_path=off 指令指示 NGINX 將它們寫入將被高速緩存的相同目錄。我們建議您將此參數(shù)設(shè)置 off 為避免在文件系統(tǒng)之間進(jìn)行不必要的數(shù)據(jù)復(fù)制。use_temp_path 在 Nginx 1.7.10 中引入。

最后,該 proxy_cache 指令激活與父 location 塊的 URL 匹配的所有內(nèi)容的緩存(在示例中為/)。您還可以在 server 塊中包含 proxy_cache 指令; 它適用于沒有自己的 location 指令的服務(wù)器的所有塊。

當(dāng)上游服務(wù)器關(guān)閉()時(shí)提供緩存內(nèi)容

Nginx 內(nèi)容緩存的一個(gè)強(qiáng)大功能是,Nginx 可以配置為在無法從原始服務(wù)器獲取新內(nèi)容時(shí)從緩存中提供已緩存的內(nèi)容。如果緩存資源的所有源服務(wù)器都已關(guān)閉或暫時(shí)占用,則會發(fā)生這種情況。

Nginx 不是將錯(cuò)誤傳遞給客戶端,而是從緩存中提供文件的陳舊版本。這為 Nginx 代理的服務(wù)器提供了額外的容錯(cuò)能力,并確保在服務(wù)器故障或流量高峰時(shí)的正常運(yùn)行時(shí)間。要啟用此功能,請包含 proxy_cache_use_stale 指令:

location / { 
  # ... 
  proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; 
}

使用此示例配置,如果 Nginx 從原始服務(wù)器收到一個(gè) error,timeout 或任何指定的 5xx 錯(cuò)誤,并且在其緩存中具有所請求文件的過時(shí)版本,則它會傳遞過時(shí)文件,而不是將錯(cuò)誤轉(zhuǎn)發(fā)到客戶端。

如何提高緩存性能

Nginx 具有豐富的可選設(shè)置,可用于微調(diào)緩存的性能。這是一個(gè)激活其中一些的例子:

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g 
         inactive=60m use_temp_path=off; 
 
 
server { 
  # ... 
  location / { 
    proxy_cache my_cache; 
    proxy_cache_revalidate on; 
    proxy_cache_min_uses 3; 
    proxy_cache_use_stale error timeout updating http_500 http_502 
               http_503 http_504; 
    proxy_cache_background_update on; 
    proxy_cache_lock on; 
 
 
    proxy_pass http://my_upstream; 
  } 
}

這些指令配置以下行為:

  • proxy_cache_revalidate 指示 Nginx 在使用 GET 條件請求時(shí),從源服務(wù)器刷新內(nèi)容。如果客戶端請求緩存但是由緩存控制頭定義的過期的內(nèi)容,則 Nginx將 If-Modified-Since 字段包含在 GET 請求的標(biāo)頭中將它發(fā)送到源服務(wù)器。因?yàn)榉?wù)器只有在 Nginx 最初緩存它時(shí)自附加到文件的標(biāo)題 Last-Modified 中記錄的時(shí)間以來修改了整個(gè)項(xiàng)目。

  • proxy_cache_min_uses 設(shè)置客戶端在 Nginx 緩存之前必須請求多少次才被緩存。如果緩存不斷填滿,這將非常有用,因?yàn)樗纱_保只將最常訪問的項(xiàng)添加到緩存中。默認(rèn) proxy_cache_min_uses 設(shè)置為 1。

  • 指令 updating 參數(shù) proxy_cache_use_stale 與啟用 proxy_cache_background_update 指令相結(jié)合,指示當(dāng)客戶端請求已過期或正在從原始服務(wù)器更新的項(xiàng)目時(shí),Nginx 會傳遞過時(shí)的內(nèi)容。所有更新都將在后臺完成。在完全下載更新的文件之前,將為所有請求返回陳舊文件。

  • 與 proxy_cache_lock 啟用,如果多個(gè)客戶端請求的文件不在緩存(MISS),只有第一個(gè)這些請求是通過原始服務(wù)器的。其余請求等待滿足該請求,然后從緩存中提取文件。如果 proxy_cache_lock 未啟用,會導(dǎo)致緩存未命中的所有請求都將直接發(fā)送到源服務(wù)器。

跨多個(gè)硬盤拆分緩存

如果您有多個(gè)硬盤驅(qū)動(dòng)器,可以使用 Nginx 在它們之間拆分緩存。以下示例根據(jù)請求 URI 將客戶端均勻分布在兩個(gè)硬盤驅(qū)動(dòng)器上:

proxy_cache_path /path/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m 
         max_size=10g inactive=60m use_temp_path=off; 
proxy_cache_path /path/to/hdd2 levels=1:2 keys_zone=my_cache_hdd2:10m 
         max_size=10g inactive=60m use_temp_path=off; 
 
 
split_clients $request_uri $my_cache { 
       50%     “my_cache_hdd1”; 
       50%     “my_cache_hdd2”; 
} 
 
 
server { 
  # ... 
  location / { 
    proxy_cache $my_cache; 
    proxy_pass http://my_upstream; 
  } 
}

這兩個(gè) proxy_cache_path 指令在兩個(gè)不同的硬盤驅(qū)動(dòng)器上定義了兩個(gè)緩存(my_cache_hdd1 和 my_cache_hdd2)。

split_clients 配置塊指定從一半的請求(結(jié)果50%)被緩存在 my_cache_hdd1 與另一半中 my_cache_hdd2?;?$request_uri 變量的哈希(請求URI)確定每個(gè)請求使用哪個(gè)緩存,結(jié)果是對給定URI的請求總是緩存在同一緩存中。

請注意,此方法不能替代 RAID 硬盤設(shè)置。如果存在硬盤驅(qū)動(dòng)器故障,則可能導(dǎo)致系統(tǒng)出現(xiàn)不可預(yù)測的行為,包括用戶看到針對故障硬盤驅(qū)動(dòng)器的請求的 500 響應(yīng)代碼。適當(dāng)?shù)?RAID 硬盤設(shè)置可以處理硬盤故障。

如何對 Nginx Cache 進(jìn)行檢測

可以在響應(yīng)頭中加入 $upstream_cache_status 變量以進(jìn)行檢測

add_header X-Cache-Status $upstream_cache_status;

此示例 X-Cache-Status 在響應(yīng)客戶端時(shí)添加 HTTP 標(biāo)頭。以下是可能的值 $upstream_cache_status:

  • MISS - 在緩存中找不到響應(yīng),因此從原始服務(wù)器獲取響應(yīng)。然后緩存響應(yīng)。

  • BYPASS - 響應(yīng)是從原始服務(wù)器獲取的,而不是從緩存中提供的,因?yàn)檎埱笈c proxy_cache_bypass 指令匹配

  • EXPIRED - 緩存中的條目已過期。響應(yīng)包含來自原始服務(wù)器的新內(nèi)容。

  • STALE- 內(nèi)容過時(shí),因?yàn)樵捶?wù)器未正確響應(yīng)但 proxy_cache_use_stale 已配置。

  • UPDATING- 內(nèi)容過時(shí),因?yàn)闂l目當(dāng)前正在更新以響應(yīng)先前的請求,并且 proxy_cache_use_stale updating 已配置。

  • REVALIDATED- proxy_cache_revalidate 指令已啟用,Nginx 驗(yàn)證當(dāng)前緩存的內(nèi)容是否仍然有效通過(If-Modified-Since或If-None-Match)。

  • HIT - 響應(yīng)直接來自有效的緩存

Nginx 如何確定是否要緩存響應(yīng)

默認(rèn)情況下,Nginx 尊重 Cache-Control 源服務(wù)器的標(biāo)頭。它不緩存響應(yīng) Cache-Control 設(shè)置為 Private,No-Cache 或 No-Store 或 Set-Cookie 在響應(yīng)頭。Nginx 只緩存 GET 和 HEAD 客戶端請求。您可以按照以下答案中的說明覆蓋這些默認(rèn)值。

如果 proxy_buffering 設(shè)置為 off,Nginx 不會緩存響應(yīng)。on 默認(rèn)的。

Nginx 是否可以忽略 Cache-Control

使用 proxy_ignore_headers 指令可以忽略 Cache-Control

location /images/ { 
  proxy_cache my_cache; 
  proxy_ignore_headers Cache-Control; 
  proxy_cache_valid any 30m; 
  # ... 
}

Nginx 忽略 /images/ Cache-Control 下所有內(nèi)容的標(biāo)題。該指令強(qiáng)制緩存數(shù)據(jù)到期,如果忽略標(biāo)頭則需要。Nginx 不會緩存沒有過期的文件。

Nginx 是否可以忽略 Set-Cookie

使用 proxy_ignore_headers 指令即可。

Nginx 如何緩存 POST 請求

使用 proxy_cache_methods 指令:

proxy_cache_methods GET HEAD POST;

此示例啟用了POST請求的緩存。

Nginx 如何緩存動(dòng)態(tài)內(nèi)容
只要 Cache-Control 標(biāo)頭允許。即使在很短的時(shí)間內(nèi)緩存動(dòng)態(tài)內(nèi)容也可以減少原始服務(wù)器和數(shù)據(jù)庫的負(fù)載,從而縮短第一個(gè)字節(jié)的時(shí)間,因?yàn)椴槐貫槊總€(gè)請求重新生成頁面。

如何不使用 Nginx 緩存

proxy_cache_bypass 指令

location / { 
  proxy_cache_bypass $cookie_nocache $arg_nocache; 
  # ... 
}

該指令定義了 Nginx 立即從源服務(wù)器請求內(nèi)容的請求類型,而不是首先嘗試在緩存中找到它。這有時(shí)被稱為通過緩存 “打孔”。

Nginx 使用什么緩存密鑰

Nginx 生成的密鑰的默認(rèn)形式類似于以下 Nginx 變量的 MD5 哈希:$scheme$proxy_host$request_uri; 使用的實(shí)際算法稍微復(fù)雜一些。

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g 
         inactive=60m use_temp_path=off; 
 
 
server { 
  # ... 
  location / { 
    proxy_cache my_cache; 
    proxy_pass http://my_upstream; 
  } 
}

對于此示例配置,緩存密鑰 http://www.example.org/my_image.jpg 計(jì)算為 md5(“http://my_upstream:80/my_image.jpg”)。

請注意,proxy_host 變量用于散列值而不是實(shí)際主機(jī)名(www.example.com)。proxy_host 定義為 proxy_pass 指令中指定的代理服務(wù)器的名稱和端口。

要更改用作密鑰基礎(chǔ)的變量,請使用該 proxy_cache_key 指令。

使用 Cookie 作為我的緩存密鑰的一部分

緩存鍵可以配置為任意值,例如:

proxy_cache_key $proxy_host$request_uri$cookie_jessionid;

此示例將 JSESSIONID cookie 的值合并到緩存鍵中。具有相同 URI 但 JSESSIONID 值不同的項(xiàng)目將作為唯一項(xiàng)目單獨(dú)緩存。

Nginx 使用 ETag 標(biāo)頭

在 Nginx 1.7.3 及更高版本中,ETag 標(biāo)頭完全支持 If-None-Match。

Nginx 如何處理字節(jié)范圍請求

如果文件在高速緩存中是最新的,則 Nginx 遵循字節(jié)范圍請求并僅向項(xiàng)目客戶端提供項(xiàng)目的指定字節(jié)。如果文件未緩存,或者文件過時(shí),Nginx 會從原始服務(wù)器下載整個(gè)文件。

如果請求是針對單個(gè)字節(jié)范圍的,則 Nginx 會在下載流中遇到該范圍后立即將該范圍發(fā)送到客戶端。如果請求在同一文件中指定了多個(gè)字節(jié)范圍,則 Nginx 會在下載完成時(shí)將整個(gè)文件傳送到客戶端。

下載完成后,Nginx 會將整個(gè)資源移動(dòng)到緩存中,以便從緩存中立即滿足所有未來的字節(jié)范圍請求,無論是單個(gè)范圍還是多個(gè)范圍。

請注意,upstream 服務(wù)器必須支持 Nginx 的字節(jié)范圍請求,以支持對該 upstream 服務(wù)器的字節(jié)范圍請求。

Nginx 如何處理 Pragma 標(biāo)頭

在 Pragma:no-cache 報(bào)頭由客戶加入到繞過所有中間緩存,直接進(jìn)入到源服務(wù)器的請求的內(nèi)容。Pragma 默認(rèn)情況下,Nginx 不支持標(biāo)頭,但您可以使用以下 proxy_cache_bypass 指令配置該功能:

location /images/ { 
  proxy_cache my_cache; 
  proxy_cache_bypass $http_pragma; 
  # ... 
}

Nginx 是否支持標(biāo)頭 stale-while-revalidate 和 stale-if-error 以及擴(kuò)展的 Cache-Control

Nginx 1.11.10 及更高版本中支持。這些擴(kuò)展做了什么:

如果當(dāng)前正在更新 stale-while-revalidate,Cache-Control HTTP 標(biāo)頭的擴(kuò)展允許使用陳舊的緩存響應(yīng)。HTTP 標(biāo)頭的 stale-if-error 擴(kuò)展 Cache-Control 允許在發(fā)生錯(cuò)誤時(shí)使用陳舊的緩存響應(yīng)。這些頭具有比較低優(yōu)先級, proxy_cache_use_stale 指令如上所述。

Nginx 是否支持 Vary 標(biāo)頭

Nginx 1.7.7 以及更高版本中是支持 Vary 標(biāo)頭的 。

關(guān)于“Nginx代理緩存配置技巧有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI