Nginx 內(nèi)容緩存

proxy_cache 運(yùn)用局部性的原理,備存一些先前被訪問過、料將被再度使用的資源,使用戶得以由前端服務(wù)器直接取得,從而減少后端服務(wù)器的資源開銷,并緩解整個(gè)系統(tǒng)的壓力。緩存也是反代的用途之一。本文介紹 Nginx 基本的緩存配置。

要啟用緩存,請?jiān)陧敿?http { } 上下文中添加 proxy_cache_path 指令。重要且強(qiáng)制的第一個(gè)參數(shù)是緩存內(nèi)容的本地文件系統(tǒng)路徑,keys_zone 參數(shù)指定用于存儲緩數(shù)據(jù)的共享內(nèi)存區(qū)域的名稱和大小。

1) proxy_cache_path 定義一個(gè)緩存目錄,路徑為 /usr/local/nginx/cache;levels=1:2 采用二級的目錄結(jié)構(gòu);keys_zone 建立一塊用于存放緩存鍵 (cache keys) 和元數(shù)據(jù) (metadata) 的共享內(nèi)存區(qū),名叫 ”the_cache_zone” 且分配 10MB 的內(nèi)存;inactive 不活躍的緩存文件 1 小時(shí)后將被清除;max_size 緩存所占磁盤空間的上限是 512MB;不另設(shè)臨時(shí)目錄。

http {
    ...
    proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=the_cache_zone:10m inactive=1h max_size=512m use_temp_path=off;
    ...
}

2) 啟用緩存。方便除錯(cuò)計(jì),添加一響應(yīng)頭用以指示緩存狀態(tài) (MISS / BYPASS / HIT …)。

下列指令請斟酌——
proxy_cache_bypass 用于指定忽略緩存的情況,當(dāng)其值為空或?yàn)榱銜r(shí),使用緩存。
proxy_cache_key 用于生成緩存鍵,區(qū)分不同的資源。要特別留心 Query String。
proxy_cache_min_uses 則規(guī)定緩存門檻,請求過多少次才緩存,不緩存低頻請求,避免浪費(fèi)。

在下例中,$is_args 反映請求的 URI 是否帶參數(shù)(網(wǎng)址中問號后面那一長串),若沒有即為空值。$request_uri 近似于 $uri$is_args$args。key 是決定緩存命中率的因素之一。

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;
    ...
}

3) Nginx 作反代時(shí),相對來說也是客戶端。若希望抓取的源站內(nèi)容總是新鮮,還需要忽略上游的緩存期限,即不遵循源站的 Cache-Control 和 Expires 等響應(yīng)頭,然后再來配置自己的緩存期限。

服務(wù)端一側(cè),proxy_cache_valid 控制的是 expiration (有效期),針對不同的 HTTP 狀態(tài)碼可以設(shè)定不同的有效期。inactive 決定的是 retention (保留期限),時(shí)間一到管你新不新鮮都要丟掉 (refresh)??梢岳斫鉃?nbsp;inactive 要優(yōu)位于 proxy_cache_valid。

proxy_cache_revalidate 將對客戶端傳來之 Etag 或 Last-Modified 作出驗(yàn)證,若服務(wù)端資源沒有變化,則使用“稍早前”緩存頁面,無論其有效期為何。有助減少回源次數(shù)。

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;
    ...
}

4) 緩存一時(shí)爽,全家火葬場。一大波緩存同時(shí)失效,會導(dǎo)致緩存雪崩 (Cache stampede),使得大批請求涌向源站。如果網(wǎng)站不是特別大、并發(fā)要求不是特別高,可以采取加鎖排隊(duì)暫時(shí)返回陳舊數(shù)據(jù)的方式緩解問題。但根本的還是要各別設(shè)定緩存期限,錯(cuò)峰更新緩存,不要一窩蜂。

proxy_cache_lock 對同一資源,未命中一次只回源一次,阻塞后續(xù)請求直至當(dāng)前請求完成。
proxy_cache_lock_age “不能者止”,如果當(dāng)前請求未能如期完成,就放行后續(xù)請求。
proxy_cache_lock_timeout 發(fā)生超時(shí),同樣放行,但不作緩存。

proxy_cache_use_stale 則是指定“共體時(shí)艱”的情境,比如服務(wù)器正在更新 (updating) 緩存的時(shí)候,或者遭遇 503 服務(wù)不可用錯(cuò)誤的時(shí)候,勉予使用 (inactive 還未清理的) 過期緩存,以保持可用性。
proxy_cache_background_update 返回陳舊數(shù)據(jù)時(shí),也跟源站要一份新鮮的,下次用。

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;
    ...
}

5) 倘若有手動清除緩存的需求,又用不起 NGINX Plus,不妨考慮 ngx_cache_purge。

下載源碼、nginx -V 檢視參數(shù)、追加參數(shù) --add-module=../ngx_cache_purge-2.3 且重新編譯 Nginx,以完成添加模塊的動作。

proxy_cache_purge 得回頭看前面的配置,使用的緩存路徑與 proxy_cache 的對應(yīng)、緩存鍵向 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;
    ...
}
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清