雖然 proxy_cache 效能不及 Memcached 等記憶體級快取,但 Nginx 目前不支援對 Memcached 執行寫入操作。對於中小型站點,正確配置 proxy_cache 足以大幅緩解後端壓力。
許多教程只提到 proxy_cache_path 與 proxy_cache,實際上還必須加上:
proxy_cache_valid 200 304 302 24h; proxy_pass https://backend_server;
200 為必要缺少任一指令,快取目錄將不會產生任何檔案。
http {
...
proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=content:20m inactive=1d max_size=100m;
proxy_temp_path /usr/local/nginx/proxy_temp;
...
}
參數解析:
levels=1:2:兩層子目錄結構keys_zone=content:20m:共享記憶體區名稱與大小inactive=1d:1 天未訪問自動刪除max_size=100m:最大磁碟佔用location / {
proxy_cache content;
proxy_cache_valid 200 304 301 302 10d;
proxy_cache_valid any 1d;
proxy_cache_key $host$uri$is_args$args;
proxy_pass https://upstream_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
}
location ~ \.(php|jsp|cgi)?$ {
proxy_pass https://backend_php;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
# 不加 proxy_cache,動態內容不快取
}
proxy_cache_path 目錄下所有內容proxy_cache_key 的哈希規則,或安裝 ngx_cache_purge 模組
proxy_cache是反向代理快取,而非靜態檔案生成器。它將上游回應存為磁碟檔案,下次請求直接服務。靜態檔案本身已在磁碟,無需再經 proxy_cache。
proxy_cache_path 與 proxy_temp_path 是否在同一分區proxy_cache_valid 涵蓋目標狀態碼/var/log/nginx/error.log 是否有權限或路徑錯誤nginx -t 驗證語法,nginx -s reload 熱重載