Nginx 快取功能經歷多代演進,從早期 proxy_store 檔案級快取,到現代 proxy_cache 記憶體/磁碟混合快取,再到第三方模組擴展。本文系統整理五大方案架構、優缺點與適用場景。
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;
}
/fetch/ → 反向代理後端 → proxy_store 儲存回應!-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 中行為複雜,生產環境慎用location /mem/ {
if ($uri ~ "^/mem/([0-9A-Za-z_]*)$") {
set $memcached_key "$1";
memcached_pass 192.168.1.2:11211;
}
expires 70;
}
# 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=5m | 5 分鐘未存取即標記可清理 |
max_size=2m | 單檔超過 2MB 不快取 |
proxy_cache_valid | 依狀態碼設定不同 TTL |
| 方案 | 儲存介質 | 動態參數支援 | 過期機制 | 非 200 狀態碼 | 適用場景 |
|---|---|---|---|---|---|
| 404 導向 | 磁碟檔案 | ❌ | 無 (需腳本) | ❌ | 靜態站點、舊版 Nginx |
| !-f 判斷 | 磁碟檔案 | ❌ | 無 (需腳本) | ❌ | 簡單靜態快取 |
| Memcached | 記憶體 | ✅ (應用層控制) | 應用層控制 | 應用層控制 | 高併發、分散式、熱點資料 |
| ncache 模組 | 記憶體 | 部分 | 模組內建 | 部分 | 需編譯模組、進階需求 |
| proxy_cache | 磁碟+記憶體 | ✅ (MD5 雜湊 Key) | 內建完整 | ✅ 依狀態碼 | 現代標準首選 |
# 掛載參數調整 (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;
最佳實踐建議:現代 Nginx 部署請直接使用
proxy_cache,搭配proxy_cache_key自訂 Key (含 $query_string)、proxy_cache_bypass/proxy_no_cache控制跳過快取條件、proxy_cache_purge第三方模組實現手動清理。靜態資源另行配置expires與add_header Cache-Control走瀏覽器快取。