Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> 電腦軟體教學 >> 伺服器技術 >> 關於伺服器

Nginx 快取機制五大方案深度解析:從傳統 proxy_store 到 proxy_cache 與 Memcached 整合

編輯:關於伺服器

Nginx 快取技術演進全景

Nginx 快取功能經歷多代演進,從早期 proxy_store 檔案級快取,到現代 proxy_cache 記憶體/磁碟混合快取,再到第三方模組擴展。本文系統整理五大方案架構、優缺點與適用場景。

方案一:傳統 404 導向快取 (proxy_store + error_page)

location / {
    root /home/html/;
    expires 1d;
    error_page 404 =200 /fetch$request_uri;
}

location /fetch/ {
    internal;
    expires 1d;
    alias /home/html/;
    proxy_pass https://backend/;
    proxy_set_header Accept-Encoding '';
    proxy_store on;
    proxy_temp_path /home/tmp;
}
  • 原理:檔案不存在 → 404 → 導向 /fetch/ → 反向代理後端 → proxy_store 儲存回應
  • 缺點:不支援帶參數動態連結、無過期清理機制、僅快取 200 狀態碼、需手動清理腳本

方案二:傳統 !-f 檔案存在判斷快取

location / {
    root /home/html/;
    proxy_store on;
    proxy_set_header Accept-Encoding '';
    proxy_temp_path /home/tmp;
    if (!-f $request_filename) {
        proxy_pass https://backend/;
    }
}
  • 優點:設定較簡潔,邏輯直觀
  • 缺點:同方案一,if 在 location 中行為複雜,生產環境慎用

方案三:基於 Memcached 的快取

location /mem/ {
    if ($uri ~ "^/mem/([0-9A-Za-z_]*)$") {
        set $memcached_key "$1";
        memcached_pass 192.168.1.2:11211;
    }
    expires 70;
}
  • 特點:Nginx 僅負責讀取 Memcached,寫入需由後端應用完成 (可配合 404 導向後端寫入)
  • 優點:高效能、分散式、支援叢集
  • 缺點:Nginx 原生無寫入機制、快取邏輯分散在應用層

方案四:第三方模組 ncache (新浪開源)

  • 結合 Nginx + Memcached 實作類 Squid 功能
  • 專案網址:code.google.com/p/ncache/
  • 本文作者未實測,供進階開發者參考

方案五:官方 proxy_cache (Nginx 0.7.44+,現為標準功能)

核心配置

# http 區塊定義快取區
proxy_cache_path /path/to/cache levels=1:2 keys_zone=MYCACHE:10m inactive=5m max_size=2m clean_time=1m;

# location 區塊啟用
location / {
    proxy_pass https://backend/;
    proxy_cache MYCACHE;
    proxy_cache_valid 200 302 1h;
    proxy_cache_valid 301 1d;
    proxy_cache_valid any 1m;
}

關鍵參數解析

參數說明
levels=1:2兩層雜湊目錄:1 字元 / 2 字元,避免單目錄檔案過多
keys_zone=NAME:10m共享記憶體區名稱與大小 (10MB 約可存 8 萬鍵值)
inactive=5m5 分鐘未存取即標記可清理
max_size=2m單檔超過 2MB 不快取
proxy_cache_valid依狀態碼設定不同 TTL

版本穩定性警示

  • Nginx 0.7.44 ~ 0.7.51 存在穩定性問題,不建議生產環境使用
  • 0.7 系列較穩定版本:0.7.39
  • 0.6 穩定版:0.6.36 (無 proxy_cache 功能)
  • 現代生產環境請使用 Nginx 1.x 穩定版 (Stable) 或 OpenResty

五大方案對比總結表

方案儲存介質動態參數支援過期機制非 200 狀態碼適用場景
404 導向磁碟檔案❌無 (需腳本)❌靜態站點、舊版 Nginx
!-f 判斷磁碟檔案❌無 (需腳本)❌簡單靜態快取
Memcached記憶體✅ (應用層控制)應用層控制應用層控制高併發、分散式、熱點資料
ncache 模組記憶體部分模組內建部分需編譯模組、進階需求
proxy_cache磁碟+記憶體✅ (MD5 雜湊 Key)內建完整✅ 依狀態碼現代標準首選

進階技巧:利用 /dev/shm 實現純記憶體快取

# 掛載參數調整 (3GB 記憶體機器範例)
mount -o size=2500M -o nr_inodes=480000 -o noatime,nodiratime -o remount /dev/shm

# proxy_cache_path 指向 /dev/shm/cache
proxy_cache_path /dev/shm/cache levels=1:2 keys_zone=RAMCACHE:100m inactive=10m;
  • 適用於熱點小檔案、極高併發讀取場景
  • 需監控記憶體使用率,避免 OOM Killer 觸發
  • 重啟機器快取消失,屬暫存性質

最佳實踐建議:現代 Nginx 部署請直接使用 proxy_cache,搭配 proxy_cache_key 自訂 Key (含 $query_string)、proxy_cache_bypass/proxy_no_cache 控制跳過快取條件、proxy_cache_purge 第三方模組實現手動清理。靜態資源另行配置 expires 與 add_header Cache-Control 走瀏覽器快取。

Copyright © Windows教程網 All Rights Reserved