NGINX 作為一款常用的網頁伺服器和反向代理伺服器,其快取機制對於提升網站效能至關重要。本文除了介紹基本的快取設定外,更探討如何精細控制快取行為,例如透過延遲快取減少磁碟寫入,利用快取重新驗證節省上游頻寬,以及根據 HTTP 狀態碼設定不同的快取時間。此外,文章也涵蓋瞭如何根據請求條件決定是否繞過快取,以及如何在單一 NGINX 例項中設定多重快取以滿足不同應用場景的需求。更進一步地,本文也探討了微快取的概念和優勢,並提供 NGINX 和 NGINX Plus 的微快取組態範例和最佳化技巧,例如使用 proxy_cache_lock 減少後端伺服器負載,以及使用 proxy_cache_use_stale 避免更新過程中的請求阻塞。最後,文章也深入解析了 NGINX 快取的內部運作機制,包含快取儲存方式、快取鍵的計算、快取載入過程、磁碟快取的管理以及 NGINX Plus 的快取清除功能,讓讀者對 NGINX 快取機制有更全面的理解。

使用NGINX和NGINX Plus進行高效能快取控制

在前面的章節中,我們已經探討了快取的基本原理、NGINX中的實作方式,以及快取如何在磁碟上儲存檔案。現在,讓我們進一步深入瞭解如何更智慧地控制快取。

簡單網站的快取

對於簡單的網站,開啟快取功能通常就能滿足所需的效能和快取行為要求。然而,總有可以最佳化的空間,而且預設行為往往不能完全符合使用者的需求。

快取控制

NGINX提供了多種指令來微調快取的運作方式。以下是一些關鍵的控制方法:

延遲快取

延遲快取是透過兩個與快取重新驗證相關的指令來實作的:

  • proxy_cache_min_uses number;:用於減少對很少存取內容的磁碟寫入。
  • proxy_cache_revalidate on;:用於節省上游頻寬和減少磁碟寫入。

在處理大量內容且大多數內容只被存取一次或兩次的情況下,延遲快取尤其有用。例如,公司簡介很少被閱讀,沒必要立即快取這些內容。

快取重新驗證

快取重新驗證修改了If-Modified-Since功能。當NGINX需要重新整理已快取的內容時,它不會傳送簡單的GET請求,而是傳送一個條件GET請求,詢問伺服器自特定時間以來內容是否有更新。如果伺服器回應304 Not Modified,則表示快取的版本仍然是最新的,這樣可以節省上游頻寬和磁碟寫入。

快取時間控制

NGINX允許對快取內容的有效期進行精細控制。即使來源伺服器設定了適合瀏覽器的快取標頭,您仍然可以覆寫這些設定,讓NGINX更頻繁地重新整理內容。

以下是一些控制快取時間的指令範例:

  • proxy_cache_valid 200 302 10m;:設定對200和302回應碼的快取有效期為10分鐘。
  • proxy_cache_valid 404 1m;:設定對404回應碼的快取有效期為1分鐘。

優先順序如下:

  1. X-Accel-Expires
  2. Cache-Control
  3. Expires
  4. proxy_cache_valid

快取決策

有時,您可能希望根據特定條件決定是否快取內容或繞過快取。proxy_cache_bypassproxy_no_cache指令提供了這種控制能力。

例如:

  • proxy_cache_bypass $cookie_nocache $arg_nocache $http_authorization;:根據特定的請求標頭或引數決定是否繞過快取。
  • proxy_no_cache $cookie_nocache $arg_nocache $http_authorization;:根據特定條件決定是否在存取來源伺服器時不快取結果。

程式碼範例:設定NGINX快取

http {
    proxy_cache_path /tmp/cache levels=1:2 keys_zone=my_cache:10m inactive=60m;
    proxy_cache_key "$scheme$request_method$host$request_uri";
    proxy_cache_min_uses 3;
    proxy_cache_revalidate on;

    server {
        listen 80;
        location / {
            proxy_pass http://origin_server;
            proxy_cache my_cache;
            proxy_cache_valid 200 1h;
            proxy_cache_valid 404 1m;
            proxy_cache_bypass $cookie_nocache;
            proxy_no_cache $http_authorization;
        }
    }
}

內容解密:

  1. proxy_cache_path指令定義了快取的儲存路徑、層級結構、記憶體中的鍵值區名稱和大小,以及非活動內容的超時時間。
  2. proxy_cache_key定義了用於快取鍵值的變陣列合,確保每個快取專案的唯一性。
  3. proxy_cache_min_uses設定了內容被快取前需要被請求的最小次數。
  4. proxy_cache_revalidate開啟後,NGINX會使用條件GET請求來驗證快取內容是否仍然有效。
  5. proxy_cache_valid指令用於設定不同HTTP回應碼的快取有效期。
  6. proxy_cache_bypassproxy_no_cache用於根據特定條件控制是否繞過快取或不快取結果。

多重快取

在大型佈署中,您可能需要在單一NGINX例項中設定多個快取。這可以根據不同租戶的服務等級或效能需求進行區分,或者為了最佳化多磁碟環境中的效能。

http {
    proxy_cache_path /tmp/cache1 levels=1:2 keys_zone=cache1:10m;
    proxy_cache_path /tmp/cache2 levels=1:2 keys_zone=cache2:10m;

    server {
        listen 80;
        location /app1 {
            proxy_pass http://app1_server;
            proxy_cache cache1;
        }
        location /app2 {
            proxy_pass http://app2_server;
            proxy_cache cache2;
        }
    }
}

內容解密:

  1. proxy_cache_path定義了兩個不同的快取路徑和對應的鍵值區。
  2. 根據不同的location區塊,將請求導向不同的上游伺服器,並使用不同的快取區。

高效能快取技術:使用 NGINX 和 NGINX Plus 實作微快取

在現代網站架構中,快取技術扮演著至關重要的角色。適當的快取策略不僅能顯著提升網站效能,還能降低伺服器負載,進而改善使用者經驗。本文將探討如何使用 NGINX 和 NGINX Plus 實作微快取(Microcaching),並詳細解析其組態與最佳化方法。

靜態內容與動態內容的快取挑戰

網站內容大致可分為靜態內容和動態內容兩類別。靜態內容,如圖片、CSS 檔案和簡單的網頁,通常容易被快取。相反,動態內容如部落格文章、狀態頁面和個人化內容(如購物車、帳戶資料等)則較難被快取。

  • 靜態內容:容易快取,如圖片、CSS 檔案。
  • 動態內容:較難快取,如部落格文章、個人化內容。

對於動態內容,快取的挑戰在於如何在保持內容新鮮度的同時,最大化快取的效果。這正是微快取技術發揮作用的地方。

微快取的概念與優勢

微快取是一種針對介於靜態內容和高度個人化動態內容之間的資料進行短暫快取的技術。透過將內容快取一段極短的時間(例如1秒),微快取能在不犧牲內容新鮮度的前提下,顯著提升網站效能並降低伺服器負載。

微快取的優勢:

  1. 短暫快取:內容快取時間極短(可短至1秒),確保使用者不會看到過時的內容。
  2. 效能提升:即使是短暫的快取,也能顯著減少伺服器負載,提升網站回應速度。
  3. 簡化快取管理:微快取減少了因快取失效或更新帶來的複雜性。

使用 NGINX 實作微快取

NGINX 是一款高效能的網頁伺服器和反向代理伺服器,支援強大的快取功能。以下是如何使用 NGINX 組態微快取的基本步驟。

基本組態範例:

proxy_cache_path /tmp/cache keys_zone=my_cache:10m levels=1:2 inactive=600s max_size=100m;
server {
    proxy_cache my_cache;
    proxy_cache_valid 200 1s;
    # 其他組態...
}

組態解說:

  1. proxy_cache_path指令:定義了快取的儲存路徑、關鍵字區域、層級結構、非活躍時間和最大容量。

    • /tmp/cache:快取儲存路徑。
    • keys_zone=my_cache:10m:定義了一個名為 my_cache 的分享記憶體區域,大小為10MB。
    • levels=1:2:設定快取的目錄層級。
    • inactive=600s:若內容在600秒內未被存取,則會被刪除。
    • max_size=100m:設定快取的最大容量為100MB。
  2. proxy_cacheproxy_cache_valid指令

    • proxy_cache my_cache;:啟用名為 my_cache 的快取區域。
    • proxy_cache_valid 200 1s;:將HTTP狀態碼為200的回應快取1秒。

最佳化微快取組態

為了進一步提升微快取的效能,NGINX 提供了多個可用的指令進行最佳化。

最佳化組態範例:

server {
    proxy_cache my_cache;
    proxy_cache_lock on;
    proxy_cache_valid 200 1s;
    proxy_cache_use_stale updating;
    # 其他組態...
}

最佳化指令解說:

  1. proxy_cache_lock指令

    • 當多個請求同時存取同一份未快取或已過期的內容時,只允許第一個請求到後端伺服器,其餘請求則進入佇列等待。一旦第一個請求完成並快取,其他請求即可直接從快取中取得內容,減少了後端伺服器的負載。
  2. proxy_cache_use_stale指令

    • 設定在更新快取內容時,允許使用過期的快取內容進行回應,避免因更新過程中的請求阻塞。

NGINX 快取的內部運作機制

瞭解 NGINX 快取的內部運作機制有助於更好地組態和最佳化快取策略。

快取儲存機制:

  • NGINX 使用磁碟為基礎的持久化快取,並與作業系統的頁面快取(Page Cache)緊密合作,將頻繁存取的內容儲存在記憶體中,以提升存取速度。
  • 快取的元資料(如快取內容的索引和過期時間)儲存在分享記憶體中,方便 NGINX 各個工作程式快速查詢。

快取運作流程:

  1. 快取內容儲存:NGINX 將回應內容儲存在磁碟上的快取目錄中。
  2. 快取載入:當 NGINX 啟動時,會載入快取元資料至分享記憶體中。
  3. 快取修剪:根據 inactive 引數的設定,定期清理長時間未被存取的快取內容。
  4. 手動清除快取:管理員可手動清除特定的快取內容。

NGINX 快取機制深入解析

NGINX 的快取機制是其高效能的關鍵因素之一,透過適當的設定和管理,可以大幅提升網站的存取速度和降低伺服器的負載。本篇文章將探討 NGINX 快取的工作原理、設定方法以及快取的管理和清除機制。

快取內容的儲存方式

在 NGINX 中,快取內容的儲存方式是透過 proxy_cache_path 指令來設定的。這個指令指定了快取儲存的位置、名稱、記憶體中元資料的大小以及磁碟上的快取大小。

proxy_cache_path /tmp/cache keys_zone=my_cache:10m levels=1:2 max_size=40m;
proxy_cache_key $scheme$proxy_host$uri$is_args$args;

在這個例子中,NGINX 將快取內容儲存在 /tmp/cache 目錄下,並且設定了一個名為 my_cache 的快取區域,大小為 10MB。levels 引數指定了快取目錄的層級結構,而 max_size 引數則限制了快取的最大大小。

內容解密:

  • proxy_cache_path 指令用於定義快取的儲存路徑和相關引數。
  • keys_zone 指定了快取區域的名稱和大小,用於儲存快取的元資料。
  • levels 引數定義了快取目錄的層級結構,有助於提升檔案系統的效能。
  • max_size 限制了快取的最大大小,防止磁碟空間被過度佔用。

快取鍵的計算

NGINX 使用 proxy_cache_key 指令來計算快取鍵,這個鍵值用於唯一標識一個可快取的資源。預設情況下,快取鍵是由請求的 scheme、Host header、URI 和查詢引陣列成。

$ echo –n “http://localhost:8002/time.php” | md5sum
6d91b1ec887b7965d6a926cff19379b4
$ cat /tmp/cache/4/9b/6d91b1ec887b7965d6a926cff19379b4

內容解密:

  • 快取鍵的計算是透過 proxy_cache_key 指令定義的字串進行 MD5 雜湊運算得到的。
  • 透過計算得到的 MD5 值,NGINX 可以確定快取內容在磁碟上的儲存位置。
  • 這個機制確保了每個請求對應的快取內容都能被正確地儲存和檢索。

從磁碟載入快取

當 NGINX 啟動時,它需要將快取內容的元資料載入到記憶體中,這個過程是由 cache loader 處理的。cache loader 會分批載入快取的元資料,以避免對系統資源造成過大負擔。

proxy_cache_path path keys_zone=name:size [loader_files=number] [loader_threshold=time] [loader_sleep=time];

內容解密:

  • cache loader 是 NGINX 在啟動時用於載入快取元資料的程式。
  • loader_filesloader_thresholdloader_sleep 引數可以用來調整 cache loader 的行為,以適應不同的硬體環境和負載情況。
  • 適當地調整這些引數,可以提升 NGINX 的啟動效率和快取載入速度。

管理磁碟快取

NGINX 的 cache manager 程式負責管理和清理磁碟上的快取內容。它會定期檢查快取內容的存取情況,並刪除長時間未被存取或超出設定大小的快取檔案。

proxy_cache_path /tmp/cache keys_zone=my_cache:10m levels=1:2 inactive=60s max_size=40m;

內容解密:

  • inactive 引數指定了快取內容在未被存取的情況下被視為過期的時間。
  • max_size 引數限制了快取的最大大小,當快取大小超出這個限制時,cache manager 會刪除最少被存取的快取檔案。
  • cache manager 的運作確保了快取內容的有效性和磁碟空間的合理使用。

使用 NGINX Plus 進行快取清除

NGINX Plus 提供了內建的快取清除功能,可以透過簡單的設定來實作對特定快取內容的清除。

proxy_cache_path /tmp/cache keys_zone=my_cache:10m levels=1:2 inactive=60s;
map $request_method $purge_method {
    PURGE 1;
    default 0;
}
server {
    proxy_cache my_cache;
    proxy_cache_purge $purge_method;
}
$ curl –X PURGE –D – http://www.example.com/*
HTTP/1.1 204 No Content

內容解密:

  • proxy_cache_purge 指令用於啟用快取清除功能。
  • 透過定義 $purge_method 變數,可以根據請求的方法(如 PURGE)來決定是否清除快取。
  • 使用 curl 命令可以傳送 PURGE 請求來清除指定的快取內容。