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/
沒有留言:
張貼留言