nginx緩存加速筆記
1 服務端緩存原理
主要是緩存代理的后端服務器
proxy_cache 運用局部性的原理,備存一些先前被訪問過、料將被再度使用的資源,使用戶得以由前端服務器直接取得,從而減少后端服務器的資源開銷,并緩解整個系統的壓力。緩存也是反代的用途之一。本文介紹 Nginx 基本的緩存配置。
1.1 定義一個緩存目錄
路徑為 /usr/local/nginx/cache;采用二級的目錄結構;建立一塊用于存放緩存鍵 (cache keys) 和元數據 (metadata) 的共享內存區,名叫 “the_cache_zone” 且分配 10MB 的內存;不活躍的緩存文件 1 小時后將被清除;緩存所占磁盤空間的上限是 512MB;不另設臨時目錄。
http {
...
proxy_cache_path /tmp/my_cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=500m;
#proxy_cache_path /tmp/my_cache levels=1:2 keys_zone=the_cache_zone:10m inactive=1h max_size=512m use_temp_path=off;
...
}
1.2 啟用緩存
方便除錯計,添加一響應頭用以指示緩存狀態 (MISS / BYPASS / HIT …)。
下列指令請斟酌——
proxy_cache_bypass 用于指定忽略緩存的情況,當其值為空或為零時,使用緩存。
proxy_cache_key 用于生成緩存鍵,區分不同的資源。要特別留心 Query String。
proxy_cache_min_uses 則規定緩存門檻,請求過多少次才緩存,不緩存低頻請求,避免浪費。
在下例中,$is_args 反映請求的 URI 是否帶參數(網址中問號后面那一長串),若沒有即為空值。$request_uri 近似于 $uri$is_args$args。key 是決定緩存命中率的因素之一。
location /es {
proxy_cache_key $request_uri;
add_header X-Cache-Status $upstream_cache_status;
proxy_cache cache_one;
proxy_cache_valid any 5m;
proxy_http_version 1.1;
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_pass http://192.168.2.222:9200/;
}
location / {
...
proxy_pass http://www.example.com;
proxy_cache the_cache_zone;
# proxy_cache_bypass $is_args;
# (default) proxy_cache_key $scheme$proxy_host$request_uri;
# proxy_cache_min_uses 3;
add_header X-Cache-Status $upstream_cache_status;
...
}
1.3 Nginx 作反代
nginx相對來說也是客戶端若希望抓取的源站內容總是新鮮,還需要忽略上游的緩存期限,即不遵循源站的 Cache-Control 和 Expires 等響應頭,然后再來配置自己的緩存期限。
服務端一側,proxy_cache_valid 控制的是 expiration (有效期),針對不同的 HTTP 狀態碼可以設定不同的有效期。inactive 決定的是 retention (保留期限),時間一到管你新不新鮮都要丟掉 (refresh)。可以理解為 inactive 要優位于 proxy_cache_valid。
proxy_cache_revalidate 將對客戶端傳來之 Etag 或 Last-Modified 作出驗證,若服務端資源沒有變化,則使用“稍早前”緩存頁面,無論其有效期為何。有助減少回源次數。
location / {
...
proxy_ignore_headers X-Accel-Expires Cache-Control Expires;
proxy_cache_valid 301 1h;
proxy_cache_valid 200 30m;
proxy_cache_valid any 1m;
proxy_cache_revalidate on;
...
}
1.4 緩存一時爽,全家火葬場。
一大波緩存同時失效,會導致緩存雪崩 (Cache stampede),使得大批請求涌向源站。如果網站不是特別大、并發要求不是特別高,可以采取加鎖排隊和暫時返回陳舊數據的方式緩解問題。但根本的還是要各別設定緩存期限,錯峰更新緩存,不要一窩蜂。
proxy_cache_lock 對同一資源,未命中一次只回源一次,阻塞后續請求直至當前請求完成。
proxy_cache_lock_age “不能者止”,如果當前請求未能如期完成,就放行后續請求。
proxy_cache_lock_timeout 發生超時,同樣放行,但不作緩存。
proxy_cache_use_stale 則是指定“共體時艱”的情境,比如服務器正在更新 (updating) 緩存的時候,或者遭遇 503 服務不可用錯誤的時候,勉予使用 (inactive 還未清理的) 過期緩存,以保持可用性。
proxy_cache_background_update 返回陳舊數據時,也跟源站要一份新鮮的,下次用。
location / {
...
proxy_cache_lock on;
# (default) proxy_cache_lock_age 5s;
# (default) proxy_cache_lock_timeout 5s;
proxy_cache_use_stale error timeout updating http_503;
proxy_cache_background_update on;
...
}
1.5 ngx_cache_purge
倘若有手動清除緩存的需求,又用不起 NGINX Plus,不妨考慮 ngx_cache_purge。
下載源碼、nginx -V 檢視參數、追加參數 --add-module=../ngx_cache_purge-2.3 且重新編譯 Nginx,以完成添加模塊的動作。
proxy_cache_purge 得回頭看前面的配置,使用的緩存路徑與 proxy_cache 的對應、緩存鍵向 proxy_cache_key 的看齊。URI 前面加上 /purge 即為清除緩存接口(最好不要被外部訪問)。
location / {
...
proxy_cache the_cache_zone;
proxy_cache_key $scheme$proxy_host$request_uri;
...
}
location ~ /purge(/.*) {
...
allow 127.0.0.1;
deny all;
proxy_cache_purge the_cache_zone $scheme$proxy_host$1$is_args$args;
...
}

浙公網安備 33010602011771號