Nginx作為高性能Web服務器與反向代理,其緩存機制是提升網站性能的關鍵手段。通過將后端響應(靜態資源、動態內容)存儲在本地(內存或磁盤),Nginx可在后續相同請求中直接返回緩存內容,減少后端服務器負載、降低網絡延遲、提高響應速度(尤其適用于高并發場景)。
作用:作為反向代理時,緩存后端服務器(如應用服務器、API服務器)的響應,適用于動態內容(如首頁、列表頁)或靜態資源的代理場景。
核心指令:proxy_cache_path
(定義緩存路徑、大?。?、proxy_cache
(啟用緩存)、proxy_cache_valid
(設置緩存有效期)。
示例配置:
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_proxy_cache:10m max_size=1g inactive=60m;
server {
location / {
proxy_cache my_proxy_cache;
proxy_pass http://backend_server;
proxy_cache_valid 200 302 10m; # 200/302狀態碼緩存10分鐘
proxy_cache_valid 404 1m; # 404狀態碼緩存1分鐘
}
}
}
作用:直接緩存圖片、CSS、JavaScript等靜態資源,利用瀏覽器Cache-Control
頭部減少重復請求,提升頁面加載速度。
核心指令:expires
(設置瀏覽器緩存時間)、add_header Cache-Control
(控制緩存行為)。
示例配置:
server {
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
expires 365d; # 瀏覽器緩存1年
add_header Cache-Control "public, no-transform"; # 允許公共緩存,不轉換內容
}
}
作用:針對PHP、Python等動態應用,緩存FastCGI服務器的響應(如PHP-FPM生成的HTML頁面),減少腳本執行次數。
核心指令:fastcgi_cache_path
(定義緩存路徑)、fastcgi_cache
(啟用緩存)、fastcgi_cache_valid
(設置緩存有效期)。
示例配置:
http {
fastcgi_cache_path /var/cache/nginx/fcgi levels=1:2 keys_zone=my_fcgi_cache:10m max_size=1g inactive=60m;
server {
location ~ \.php$ {
fastcgi_cache my_fcgi_cache;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_cache_valid 200 30m; # 200狀態碼緩存30分鐘
}
}
}
proxy_cache_path
(反向代理緩存路徑)levels=1:2
:緩存目錄層級(1級目錄+2級子目錄,如/var/cache/nginx/a/b/
),避免單個目錄文件過多;keys_zone=my_cache:10m
:共享內存區域(用于存儲緩存鍵),10m
表示10MB內存;max_size=1g
:緩存最大容量(1GB),超過后自動清理舊緩存;inactive=60m
:緩存未訪問的超時時間(60分鐘),超時則刪除。proxy_cache_valid
(緩存有效期)proxy_cache_valid 200 302 10m;
表示200(成功)和302(重定向)狀態碼的響應緩存10分鐘。add_header
(緩存狀態標識)X-Proxy-Cache
:顯示緩存狀態(HIT
表示命中、MISS
表示未命中、EXPIRED
表示過期);Cache-Control
:控制瀏覽器緩存行為(如public
表示允許公共緩存、no-transform
表示不轉換內容)。add_header X-Proxy-Cache $upstream_cache_status;
$scheme$proxy_host$request_uri
(協議、主機名、URI),可通過proxy_cache_key
自定義(如排除查詢參數proxy_cache_key "$scheme$proxy_host$request_uri"
),減少因參數變化導致的緩存未命中。inactive
參數:根據業務場景設置合理的未訪問超時時間(如靜態資源設為30d
,動態內容設為1h
),避免頻繁清理緩存。GET
請求(if ($request_method = GET) { proxy_cache my_cache; }
),避免POST
(含用戶提交數據)或PUT
/DELETE
(修改數據)請求的緩存。365d
,動態內容(如首頁)設為10m
,兼顧性能與數據新鮮度。cron
定時任務(如0 0 * * * nginx -s reload
)每天凌晨重新加載Nginx,清理過期緩存;或利用inactive
參數自動清理長期未訪問的緩存。/purge
接口(需授權),使用proxy_cache_purge
模塊清除指定URL的緩存(如curl -X PURGE http://example.com/purge?url=/path/to/resource
)。proxy_ignore_headers Set-Cookie
忽略響應中的Set-Cookie
頭部,防止緩存帶會話信息的響應。內存緩存
(proxy_cache_path
的keys_zone
),大量靜態數據(如圖片)用磁盤緩存
(/var/cache/nginx
),平衡速度與容量。proxy_cache
、fastcgi_cache
),Ubuntu默認倉庫的Nginx通常已包含這些模塊。