淺談 nginx proxy cache
本篇文章介紹了nginx proxy 緩存簡介、配置、優化。
回顧上篇文章:從零認識區塊鏈
nginx proxy 緩存簡介
nginx 將用戶已經訪問過的內容保留在 nginx 伺服器本地,這樣在一段時間內用戶再次訪問該數據,就不需要 nginx 伺服器對後端伺服器發請求,減少 nginx 和後端伺服器之間的網路阻塞,減小數據延遲,提高用戶訪問速度。即使後端伺服器宕機,nginx 的 cache 也會返回給客戶端請求,不至於服務不可用。 proxy cache 是把請求的鏈接用 md5 編碼 hash 後保存,所以它可以支持任意鏈接,同時也支持 404/301/302 這樣的非 200 狀態。
nginx proxy cache 緩存配置
配置樣例
配置項說明
proxy_cache_path:本地路徑,緩存文件存放路徑。
levels:cache 目錄的層次,使用 2 級目錄來存儲緩存文件。
keys_zone: 在共享內存中設置一塊存儲區域來存放緩存的 key 和 metadata(類似使用次數),這樣 nginx 可以快速判斷一個 request 是否命中或者未命中緩存,1m 可以存儲 8000 個 key,10m 可以存儲 80000 個 key。
inactive: 未被訪問文件在緩存中保留時間,本配置中如果 2 天未被訪問,緩存控制程序會刪掉文件,默認為 10 分鐘。
max_size: 最大 cache 空間,如果不指定,會使用掉所有 disk space,當達到配額後,會刪除最少使用的 cache 文件。
proxy_cache: 啟用 proxy cache,指定 key_zone。
proxy_cache_valid: 設置不同相應碼的緩存時間,當不指定響應碼的時候,例如 proxy_cache_valid 5m; 只對響應碼為 200,301,302 的訪問請求資源設置緩存時間。
proxy_cache_key:若某個介面返回的值基本不變,或者是特定類別的,就可以根據請求的 url 的參數,自定義 cache key。
proxy_ignore_headers:禁止處理來自代理伺服器的應答,可以設置的欄位有」X-Accel-Redirect」, 「X-Accel-Expires」, 「Expires」 或」Cache-Control。
注意:proxy_cache_key 壓縮方式 Accept-Encoding 應該指定為通用壓縮格式,防止客戶端不支持某種壓縮方式。
nginx log 里可以添加緩存命中狀態,便於查看是否命中,統計緩存命中率,具體可以如下定義格式:
$upstream_cache_status 包含以下幾種狀態:
MISS:未命中,請求被傳到後端
HIT:緩存命中
EXPIRED:緩存過期,請求被傳到後端
UPDATING:緩存正在更新,使用舊緩存應答
STALE:後端將得到過期的應答
故障時利用 cache 對服務降級
當調用後端介面暫時故障時,比如用手機看視頻拿不到播放數據,或者不出廣告,這時候如果有 cache,nginx 會返回給客戶端之前暫存的緩存數據,或者提前準備好的靜態頁面,用戶不至於面對一個空白頁面。對於重要的一級介面,可以每天請求一次填充 cache 到備份 nginx 伺服器,即使線上後端介面完全不可用,流量冗餘到備份伺服器,對用戶體驗也不會有很大影響。
cache 優化
nginx 只有硬碟級別 cache,沒有內置內存級別的 cache,為了利用內存加速,減少伺服器響應時間,可以將 cache 目錄掛載到 / dev/shm 內存目錄。
mount --bind /dev/shm/proxy_cache /home/work/nginx/proxy_cache
線上流量相差不大的情況下,將 cache 目錄掛載到內存與未掛載到內存的耗時對比,還是有明顯差距,將 cache 目錄掛載到內存中,響應時間可以縮短 7 倍以上。
總結
緩存不是什麼高深技術,但是正確利用緩存,在業務遭受大流量衝擊下,會起到重要作用,緩存的 key 設置需合理,避免不正確緩存。
參考資料
http://nginx.org/en/docs/http/ngx_http_proxy_module.html
http://www.alonely.com.cn/Nginx/20160827/18993.html
小米運維
和我們一起,成為更酷的運維工程師
TAG:小米運維 |