nginx本地緩存


 Nginx 作為Web服務器或者負載均衡器,一般不執行業務邏輯,而是將請求轉到后端服務器,比如 Tomcat 或者 php-fpm,后端處理完畢之后將經過 nginx 將數據返回給用戶。在請求轉發的過程中,nginx 可將中間數據在本地進行緩存,這樣未來一段時間內的請求相同的數據,Nginx 可以直接返回本地復本,而不是再次向后端服務發起請求,可以大大降低后端服務器的壓力。同時,在后端服務器宕機時,Nginx 還可返回緩存數據,而不中端服務,提高了服務的可用性。

​Nginx 可以將緩存數據持久化到本地磁盤上,不會因為Nginx 退出或者服務器重啟而都是,Nginx 重啟之后會自動掃描磁盤的上緩存數據並建立索引,保證服務的持續性。

Nginx 的緩存配置:

    # 定義緩存路徑、過期時間、空間大小等
    proxy_cache_path  /tmp/nginx/cache levels=2:2:2 use_temp_path=off keys_zone=my_cache_name:10m inactive=1h max_size=1g;

    server {
        listen       8000;
        server_name  localhost;
        # 添加緩存的 http 狀態頭
        add_header X-Cache-Status $upstream_cache_status;

        location / {
                # 定義緩存名稱
                proxy_cache my_cache_name;
                # 定義緩存key
                proxy_cache_key $host$uri$is_args$args;
                # 針對返回裝裝他碼單獨定義緩存時間
                proxy_cache_valid 200 304 10m;
                # url 上代用 nocache 獲取請求投中代用 nocache,切值為true 時不走緩存。
                proxy_cache_bypass $arg_nocache $http_nocahe;

                proxy_pass http://localhost:8080;
        }
    }

proxy_cache_path 的常用指令介紹:

  • levels=2:2:2,表示緩存目錄的層級,2:2:2 表示創建兩級目錄,第一個目錄名用一個字符表示,第二級目錄用兩個字符表示,如:/tmp/nginx/cache/83/64/d4…。這樣可以緩解緩存文件過多,都集中在一個目錄下的檢索速度慢問題。目前,nginx 最多支持三級目錄(用兩個冒號分割),每級1~2個字符的目錄名。
  • keys_zone=my_cache_name:10m,設置緩存名稱,key的存儲空間大小,由於Nginx 是多進程的工作模式,所以key緩存在共享內存中。按照官方文檔的說法,1M的內存空間大概能存8000個key。
  • use_temp_pat=off,默認為on,建議甚至為off,默認情況下,緩存內容先寫到臨時文件中(proxy_temp_path),然后通過重命名到 proxy_cache_path 設置的路徑中。如果為 off,則緩存內容直接寫入 proxy_cache_path 制定的路徑中。
  • inactive=1h,設置緩存的失效時間,1h表示一個小時。如果緩存數據在 inactive 給定的時間內訪問過,則會被移除。
  • max_size=1g,設置緩存的存儲空間占用的上限,當存滿時nginx 的 “cache manager”進程就會按照LRU(最近最少使用)原則清理緩存。
  • manager_files, manager_threshold, manager_sleep 控制 cache manager 進程的活動周期。manager_files 設置每次 cache manager 的清除數量(默認100條),manager_threshold 控制每個清理周期的時長(默認200毫秒),manager_sleep 控制兩次清理周期的時間間隔(默認50毫秒)。
  • loader_files,loader_sleep,loader_threshold,用來控制“cache loader”進程的活動,“cache loader” 進程負責將之前存儲在文件系統的中的緩存加載在緩存區,重啟nginx的時候,這個功能比較有用,加載過程也是周期性迭代進行,loader_files設置每次加載多少條(默認100個),loader_threshold設置設置每次加載周期的時長(默認200毫秒),loader_sleep設置加載周期的間隔(默認50毫秒)。

常用緩存配置指令:

  • proxy_cache : 設置使用哪個緩存區,如 proxy_cache <my_cache_name>,同一個緩存區可以被多處配置共享,默認是關閉狀態,off 表示關閉緩存功能。

  • proxy_cache_key:設置緩存key的格式,默認格式為 $scheme$proxy_host$request_uri,既 URL 路徑,支持變量參數,使用時可以根據具體需求進行設置,比如加入 cookie 信息。

  • proxy_cache_valid ,設置緩存時間,還可以根據狀態碼分別分別設置 緩存時間,例如:

    • proxy_cache_valid 200 302 10m;
    • proxy_cache_valid 301 1h;
    • proxy_cache_valid any 1m;
  • proxy_no_cache:用來設置不被緩存的條件,比如,proxy_no_cache$arg_nocache; 表示 url 帶有參數nocahe 且指部位空或者0,則請求內容就不會被緩存,比如,curl http://127.0.0.1:8000/ 會被緩存, curl http://127.0.0.1:8000/?nocahe=1,則不會被緩存,http://127.0.0.1:8000/?nocahe=0 或者 http://127.0.0.1:8000/?nocahe= 則會被緩存。另外,還可以通過 http請求頭,cookie 中的參數來控制,該指令在進行調試的時候很有用。

  • proxy_cache_bypass:該指令設置在什么情況下直接從后端的獲取內容,不走緩存。如果命中條件,如 proxy_cache_bypass$arg_nocache,當url帶有參數nocache時(參數值為1或者非空),則直接從后端讀取內容且 $upstream_cache_status 的狀態值為 BYPASS。改指令和proxy_no_cache 在使用現象上類似,對用同樣的設置,差別在於proxy_no_cache命中條件不緩存內容,而proxy_cache_bypass會緩存內容,比如同樣是 nocache=1,對於一個尚未被緩存的url內容,proxy_no_cache 命中條件后不緩存內容,proxy_cache_bypass會緩存內容,可以關鍵 /tmp/nginx/cache(proxy_cache_path中設置的緩存文件路徑)目錄中文件的變化來感覺他們之間的差別,實際項目中,兩個指令旺旺同時使用。

  • proxy_cache_min_uses:在給定請求次數之后在進行緩存,默認為1(既一次請求就緩存),當緩存空間有限時,每次請求都緩存會造成比較大空間的浪費,通過這個參數可以有效區別熱點數據。

  • proxy_cache_use_stale:如果后端服務器出錯不能返回有效結果時,返回緩存數據(即使已過期)也沒有數據要好,proxy_cache_use_stale 可以用戶兜底方案,作為頁面容災使用。比如可以這樣設置,

    proxy_cache_use_stale error timeout http_500 http__502 http_503 http_504
    

    當后端服務器出現50x錯誤,或者超時或者無法鏈接時,則返回已過期的緩存數據,同時 $upstream_cache_status 狀態值變為 STALE。另外,還可以通過 Cache-Control HTTP 頭中的stale-while-revalidate 和 stale-if-error 兩個擴展參數進行控制,但優先級更低。

  • proxy_cache_revalidate:

  • proxy_cache_methods:

  • proxy_cache_lock:

  • add_header Cache-Status $upstream_cache_status :在HTTP 響應頭中添加緩存狀態,例如,可以通過“curl http://127.0.0.1:8000/ -I”進行查看。$upstream_cache_status包含如下幾種狀態,比較常見的是 HIT,MISS 兩種狀態:

    • HIT:命中緩存,直接返回緩存內容。
    • MISS: 未命中緩存,將請求發給后端,同時將返回內容進行緩存。
    • EXPIRED:命中緩存,但緩存數據已過期,將請求轉發給后端,同時將返回內容進行緩存。
    • UPDATING:當緩存已經過正在被其他nginx worker進程更新時,返回該狀態嗎。
    • BYPASS: 當命中 proxy_cache_bypass 中設置的條件時,直接從后端源站返回內容,該變量狀態變為BYPASS。
    • REVALIDATED:
    • STALE: 命中 proxy_cache_use_stale 指令設置的條件時,既后端服務器出現錯誤時,返回過期的緩存數據時,會返回這個狀態碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM