2021年12月9日 星期四

Nginx學習筆記 (8) - Cache緩存配置


Cache 可以減輕後端 server 的負擔,同樣的 request 內容不用每次都再跟 server 要資料,可以使用 Nginx Cache 裡存的 response 做回應


Cache 配置


http {
    # ...
    proxy_cache_path /var/cache/nginx keys_zone=one:10m levels=1:2 inactive=3h max_size=10g;

    proxy_cache_key '$host$request_uri $cookie_user';

    server {
        proxy_cache one;
        proxy_cache_valid  200 302 100m;
        location / {
            proxy_pass http://app;
        }
    }
}


- proxy_cache_path:設定緩存目錄,levels 設定目錄結構 (1:2 指第一層檔名一個字,第二層檔名兩個字,最多三層),key_zone 用來設定共享內存,前面是內存名字,':'後是內存大小,inactive 設定緩存期效 (預設10分鐘),max_size 設定緩存大小上限

- proxy_cache_key:設定緩存 key 如何比對 

- proxy_cache zone \| off: 是否使用 cache,zone 是填入 key zone 名

- proxy_cache_valid [code ...] time:設定哪些 reponse 要緩存,proxy_cache_valid  200 302 100m 指會緩存 status code 為 200 或 302 的回覆,會緩存 100分鐘,後面的時間要設定的比 proxy_cache_path 的 inactive 短才有意義


測試

default.conf:

proxy_cache_path /var/cache/nginx keys_zone=myzone:10m levels=1:2 max_size=10g;
proxy_cache_key '$host$request_uri';

upstream app {
    server my-app:5000;
    server my-app-2:5001;
}

server {
    listen  80;
    server_name localhost;

    location / {
        proxy_cache myzone;
        proxy_cache_valid  any 100m;
        proxy_cache_bypass $http_cache_bypass;
        proxy_pass http://app;
    }
    add_header X-Cache-Status $upstream_cache_status;
}


- curl -v localhost/test

第一次打會是 MISS,第二次打會 HIT,從 log 看也會發現並沒有 requset 打到 server 端


- proxy_cache_bypass string ...

後接的字串不為空且不等於"0"的話,這個請求不會從 cache 拿緩存的回覆,而是一定會從後端 server 拿回覆


測試:curl -v localhost/test --header "cache-bypass: true"

會看到 X-Cache-Status: BYPASS,並且是從 my-app 拿到 response


參考資料/推薦閱讀

1. https://www.nginx.com/blog/nginx-caching-guide/



沒有留言:

張貼留言