開頭:某個項目涉及到 視頻切片下載到本地,然后提供服務給客戶端。一個視頻有多個文件,存儲在本地路徑下。當客戶端請求的視頻在本地沒有就會回源,
回源拿到的視頻文件再返回給客戶端,同時在本地緩存一份,提供給下一個相同請求的用戶。
可參考另一位大佬的講解 https://blog.csdn.net/dengjiexian123/article/details/53386586/
https://blog.csdn.net/f529352479/article/details/51445320
https://blog.csdn.net/hero00e/article/details/52858196 緩存的指令 、結構體
本文結合項目關於緩存的使用情況來展開。
1. 配置 proxy_cache 模塊
在 nginx.conf 文件添加 如下代碼:
proxy_cache_path /mnt/zxdfs/service/ottcache/cachevod levels=1:2 keys_zone=cachefile:100m inactive=180d max_size=148g limitedexpiredfiles=2 expiredtimeinterval=2300-1900 expired_percent=95;
代碼說明:
proxy_cache_path 緩存文件路徑
levels 設置緩存文件目錄層次;levels=1:2 表示兩級目錄
keys_zone 設置緩存名字和共享內存大小.【在使用的地方要使用相同的變量名】
inactive 在指定時間內沒人訪問則被刪除
max_size 最大緩存空間,如果緩存空間滿,默認覆蓋掉緩存時間最長的資源。
這些是默認有的配置,當然可以根據自己業務的需求對緩存有其他新增的配置說明。
當配置好之后,重啟nginx,如果不報錯,則配置的proxy_cache會生效
2. 使用 proxy_cache
使用proxy_cache ,需要在另一個location配置使用條件:
location /internal_proxyfile { internal; sendfile off; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Connection "keep-alive"; proxy_set_header Accept-Encoding ""; proxy_cache_use_stale error timeout updating http_502 http_504; #此處是托底配置,舊的總比出錯強,當nginx請求后台服務器報錯的時候, #如果返回配置的錯誤響應碼,nginx則直接取緩存文件中的舊數據返回給用戶,托底使用必選配置。 proxy_cache_lock off; #緩存並發鎖,當nginx緩存沒有命中的時候只有一個請求回源tomcat請求數據,其他請求會等待。非必選配置。 #意思就是 當多個請求傳遞到此配置時即他們的proxy_cache_key 是一樣的,那多個請求只有一個才會真正回源【即到真正應用階段生成響應內容】, #最后將響應內容 添加到 cache ,然后其他請求 就從cache 獲取數據,或直到超時。
proxy_cache_lock_timeout 20s; #等待鎖超時時間設置 非必選配置。 proxy_ignore_headers Cache-Control Expires; proxy_cache cachefile; # 配置了緩存空間名稱,具體可以看節點的 proxy_disk.conf ,不同的請求對應不同的空間名稱。 proxy_cache_valid 200 206 304 180d; # 根據響應碼設置緩存時間,超過這個時間即使緩存文件中有緩存數據,nginx也會回源請求新數據。 proxy_cache_key $cdn_cid; proxy_cache_prefix_dir $cpid_cid; proxy_pass $upstream_url;
# 代理后轉發的路徑 }
在第一次訪問到達該location時候,本地是沒有緩存的,會在最后經過 proxy_pass 代理的路徑處理完在本地【即 proxy_cache 配置的緩存路徑緩存一份】;
同一個url第二次訪問,再次到達該location,proxy_cache 會在自己的緩存路徑找到對應的緩存文件,就會直接返回給客戶端,無需向后續的代理路徑轉發。