主頁 > 知識庫 > 18個運維必知的Nginx代理緩存配置技巧(你都掌握了哪些呢)

18個運維必知的Nginx代理緩存配置技巧(你都掌握了哪些呢)

熱門標簽:使用U盤裝系統(tǒng) 阿里云 檢查注冊表項 網(wǎng)站建設(shè) 百度競價點擊價格的計算公式 硅谷的囚徒呼叫中心 智能手機 美圖手機

我們都知道應(yīng)用程序和網(wǎng)站的性能是他們成功的關(guān)鍵因素。但是,使您的應(yīng)用程序或網(wǎng)站表現(xiàn)更好的過程并不總是很清楚。代碼質(zhì)量和基礎(chǔ)架構(gòu)當然至關(guān)重要,但在許多情況下,您可以通過專注于一些非常基本的應(yīng)用程序的交付技術(shù),對應(yīng)用程序的最終用戶體驗進行大量改進。

其中一個例子是在應(yīng)用程序棧中實現(xiàn)和優(yōu)化緩存。在教程中介紹的技術(shù)可以幫助新手和高級用戶使用 Nginx 中包含的內(nèi)容緩存功能,從而獲得更好的性能。

概覽

內(nèi)容緩存位于客戶端和源服務(wù)器 (upstream) 之間,并保存它看到的所有內(nèi)容的副本。如果客戶端請求緩存已存儲的內(nèi)容,則它會直接返回內(nèi)容而不連接源服務(wù)器。這提高了性能,因為內(nèi)容緩存更靠近客戶端,并且更有效地使用應(yīng)用程序服務(wù)器,因為它們不必每次都從頭開始生成頁面。

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

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

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

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

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

只需要兩個指令即可啟用基本緩存: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è)置一個兩級目錄層次結(jié)構(gòu)。在單個目錄中包含大量文件會降低文件訪問速度,因此我們建議對大多數(shù)部署使用兩級目錄層次結(jié)構(gòu)。如果 levels 未包含該參數(shù),Nginx 會將所有文件放在同一目錄中。
  • keys_zone 設(shè)置共享內(nèi)存區(qū)域,用于存儲緩存鍵和元數(shù)據(jù),例如使用計時器。擁有內(nèi)存中的密鑰副本,Nginx 可以快速確定請求是否是一個 HIT 或 MISS 不必轉(zhuǎn)到磁盤,從而大大加快了檢查速度。1 MB 區(qū)域可以存儲大約 8,000 個密鑰的數(shù)據(jù),因此示例中配置的 10 MB 區(qū)域可以存儲大約 80,000 個密鑰的數(shù)據(jù)。
  • max_size 設(shè)置緩存大小的上限(在本例中為 10 千兆字節(jié))。它是可選的; 不指定值允許緩存增長以使用所有可用磁盤空間。當緩存大小達到限制時,一個稱為緩存管理器的進程將刪除最近最少使用的緩存,將大小恢復(fù)到限制之下的文件。
  • inactive 指定項目在未被訪問的情況下可以保留在緩存中的時間長度。在此示例中,緩存管理器進程會自動從緩存中刪除 60 分鐘未請求的文件,無論其是否已過期。默認值為 10 分鐘(10m)。非活動內(nèi)容與過期內(nèi)容不同。Nginx 不會自動刪除緩存 header 定義為已過期內(nèi)容(例如 Cache-Control:max-age=120)。過期(陳舊)內(nèi)容僅在指定時間內(nèi)未被訪問時被刪除。訪問過期內(nèi)容時,Nginx 會從原始服務(wù)器刷新它并重置 inactive 計時器。
  • Nginx 首先將發(fā)往高速緩存的文件寫入臨時存儲區(qū)域,use_temp_path=off 指令指示 NGINX 將它們寫入將被高速緩存的相同目錄。我們建議您將此參數(shù)設(shè)置 off 為避免在文件系統(tǒng)之間進行不必要的數(shù)據(jù)復(fù)制。use_temp_path 在 Nginx 1.7.10 中引入。

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

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

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

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

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

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

如何提高緩存性能

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

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 條件請求時,從源服務(wù)器刷新內(nèi)容。如果客戶端請求緩存但是由緩存控制頭定義的過期的內(nèi)容,則 Nginx將 If-Modified-Since 字段包含在 GET 請求的標頭中將它發(fā)送到源服務(wù)器。因為服務(wù)器只有在 Nginx 最初緩存它時自附加到文件的標題 Last-Modified 中記錄的時間以來修改了整個項目。
  • proxy_cache_min_uses 設(shè)置客戶端在 Nginx 緩存之前必須請求多少次才被緩存。如果緩存不斷填滿,這將非常有用,因為它可確保只將最常訪問的項添加到緩存中。默認 proxy_cache_min_uses 設(shè)置為 1。
  • 指令 updating 參數(shù) proxy_cache_use_stale 與啟用 proxy_cache_background_update 指令相結(jié)合,指示當客戶端請求已過期或正在從原始服務(wù)器更新的項目時,Nginx 會傳遞過時的內(nèi)容。所有更新都將在后臺完成。在完全下載更新的文件之前,將為所有請求返回陳舊文件。
  • 與 proxy_cache_lock 啟用,如果多個客戶端請求的文件不在緩存(MISS),只有第一個這些請求是通過原始服務(wù)器的。其余請求等待滿足該請求,然后從緩存中提取文件。如果 proxy_cache_lock 未啟用,會導(dǎo)致緩存未命中的所有請求都將直接發(fā)送到源服務(wù)器。

跨多個硬盤拆分緩存

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

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; 
  } 
}

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

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

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

如何對 Nginx Cache 進行檢測

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

add_header X-Cache-Status $upstream_cache_status;

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

  • MISS - 在緩存中找不到響應(yīng),因此從原始服務(wù)器獲取響應(yīng)。然后緩存響應(yīng)。
  • BYPASS - 響應(yīng)是從原始服務(wù)器獲取的,而不是從緩存中提供的,因為請求與 proxy_cache_bypass 指令匹配
  • EXPIRED - 緩存中的條目已過期。響應(yīng)包含來自原始服務(wù)器的新內(nèi)容。
  • STALE- 內(nèi)容過時,因為源服務(wù)器未正確響應(yīng)但 proxy_cache_use_stale 已配置。
  • UPDATING- 內(nèi)容過時,因為條目當前正在更新以響應(yīng)先前的請求,并且 proxy_cache_use_stale updating 已配置。
  • REVALIDATED- proxy_cache_revalidate 指令已啟用,Nginx 驗證當前緩存的內(nèi)容是否仍然有效通過(If-Modified-Since或If-None-Match)。
  • HIT - 響應(yīng)直接來自有效的緩存

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

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

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

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)容的標題。該指令強制緩存數(shù)據(jù)到期,如果忽略標頭則需要。Nginx 不會緩存沒有過期的文件。

Nginx 是否可以忽略 Set-Cookie

使用 proxy_ignore_headers 指令即可。

Nginx 如何緩存 POST 請求

使用 proxy_cache_methods 指令:

proxy_cache_methods GET HEAD POST;

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

Nginx 如何緩存動態(tài)內(nèi)容
只要 Cache-Control 標頭允許。即使在很短的時間內(nèi)緩存動態(tài)內(nèi)容也可以減少原始服務(wù)器和數(shù)據(jù)庫的負載,從而縮短第一個字節(jié)的時間,因為不必為每個請求重新生成頁面。

如何不使用 Nginx 緩存

proxy_cache_bypass 指令

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

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

Nginx 使用什么緩存密鑰

Nginx 生成的密鑰的默認形式類似于以下 Nginx 變量的 MD5 哈希:$scheme$proxy_host$request_uri; 使用的實際算法稍微復(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 計算為 md5(“http://my_upstream:80/my_image.jpg”)。

請注意,proxy_host 變量用于散列值而不是實際主機名(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 值不同的項目將作為唯一項目單獨緩存。

Nginx 使用 ETag 標頭

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

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

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

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

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

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

Nginx 如何處理 Pragma 標頭

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

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

Nginx 是否支持標頭 stale-while-revalidate 和 stale-if-error 以及擴展的 Cache-Control

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

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

Nginx 是否支持 Vary 標頭

Nginx 1.7.7 以及更高版本中是支持 Vary 標頭的 。

結(jié)論

至此,您應(yīng)該很好地理解 Nginx 代理緩存的工作原理以及如何正確配置 Nginx 代理緩存。如果您有任何問題或反饋,請隨時發(fā)表評論。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

標簽:懷化 黃山 賀州 煙臺 通遼 湖北 山南 湘潭

巨人網(wǎng)絡(luò)通訊聲明:本文標題《18個運維必知的Nginx代理緩存配置技巧(你都掌握了哪些呢)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266