濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > 18個(gè)運(yùn)維必知的Nginx代理緩存配置技巧(你都掌握了哪些呢)

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

熱門(mén)標(biāo)簽:百度地圖標(biāo)注公司位置要多少錢(qián) 400電話號(hào)碼辦理多少錢(qián) 承德地圖標(biāo)注公司 濮陽(yáng)好的聯(lián)通400電話申請(qǐng) 山東企業(yè)外呼系統(tǒng)公司 虛假地圖標(biāo)注 靈圖uu電子寵物店地圖標(biāo)注 地圖標(biāo)注黃河的位置 地圖標(biāo)注如何改成微信號(hào)

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

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

概覽

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

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

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

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

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

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

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

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

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è)置:

緩存的本地磁盤(pán)目錄稱(chēng)為 /path/to/cache/。

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

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

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

Nginx 不是將錯(cuò)誤傳遞給客戶(hù)端,而是從緩存中提供文件的陳舊版本。這為 Nginx 代理的服務(wù)器提供了額外的容錯(cuò)能力,并確保在服務(wù)器故障或流量高峰時(shí)的正常運(yùn)行時(shí)間。要啟用此功能,請(qǐng)包含 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ò)誤,并且在其緩存中具有所請(qǐng)求文件的過(guò)時(shí)版本,則它會(huì)傳遞過(guò)時(shí)文件,而不是將錯(cuò)誤轉(zhuǎn)發(fā)到客戶(hù)端。

如何提高緩存性能

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

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

如果您有多個(gè)硬盤(pán)驅(qū)動(dòng)器,可以使用 Nginx 在它們之間拆分緩存。以下示例根據(jù)請(qǐng)求 URI 將客戶(hù)端均勻分布在兩個(gè)硬盤(pán)驅(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è)不同的硬盤(pán)驅(qū)動(dòng)器上定義了兩個(gè)緩存(my_cache_hdd1 和 my_cache_hdd2)。

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

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

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

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

add_header X-Cache-Status $upstream_cache_status;

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

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

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 客戶(hù)端請(qǐng)求。您可以按照以下答案中的說(shuō)明覆蓋這些默認(rèn)值。

如果 proxy_buffering 設(shè)置為 off,Nginx 不會(huì)緩存響應(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 不會(huì)緩存沒(méi)有過(guò)期的文件。

Nginx 是否可以忽略 Set-Cookie

使用 proxy_ignore_headers 指令即可。

Nginx 如何緩存 POST 請(qǐng)求

使用 proxy_cache_methods 指令:

proxy_cache_methods GET HEAD POST;

此示例啟用了POST請(qǐng)求的緩存。

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

如何不使用 Nginx 緩存

proxy_cache_bypass 指令

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

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

Nginx 使用什么緩存密鑰

Nginx 生成的密鑰的默認(rèn)形式類(lèi)似于以下 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; 
  } 
}

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

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

要更改用作密鑰基礎(chǔ)的變量,請(qǐng)使用該 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é)范圍請(qǐng)求

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

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

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

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

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

在 Pragma:no-cache 報(bào)頭由客戶(hù)加入到繞過(guò)所有中間緩存,直接進(jìn)入到源服務(wù)器的請(qǐng)求的內(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)先級(jí), proxy_cache_use_stale 指令如上所述。

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

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

結(jié)論

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:福州 樂(lè)山 淮安 上海 鷹潭 德宏 安康 泰安

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《18個(gè)運(yùn)維必知的Nginx代理緩存配置技巧(你都掌握了哪些呢)》,本文關(guān)鍵詞  18個(gè),運(yùn)維,必知,的,Nginx,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《18個(gè)運(yùn)維必知的Nginx代理緩存配置技巧(你都掌握了哪些呢)》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于18個(gè)運(yùn)維必知的Nginx代理緩存配置技巧(你都掌握了哪些呢)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    京山县| 富源县| 安塞县| 都兰县| 辛集市| 平利县| 北辰区| 岳普湖县| 仪陇县| 天等县| 焦作市| 永定县| 德江县| 隆子县| 高要市| 株洲市| 沅江市| 蓬莱市| 淮阳县| 博白县| 龙州县| 婺源县| 太湖县| 平山县| 兴化市| 尚志市| 海丰县| 天津市| 夹江县| 石泉县| 伊通| 昭通市| 浑源县| 青浦区| 兴义市| 武冈市| 洛隆县| 寿光市| 久治县| 五台县| 淄博市|