nginx proxy 緩存簡介html
轉自:https://mp.weixin.qq.com/s/DRTWuwiB6gdrRVEP6UWBAgnginx
nginx 將用戶已經訪問過的內容保留在 nginx 服務器本地,這樣在一段時間內用戶再次訪問該數據,就不須要 nginx 服務器對後端服務器發請求,減小 nginx 和後端服務器之間的網絡阻塞,減少數據延遲,提升用戶訪問速度。即便後端服務器宕機,nginx 的 cache 也會返回給客戶端請求,不至於服務不可用。 proxy cache 是把請求的連接用 md5 編碼 hash 後保存,因此它能夠支持任意連接,同時也支持 404/301/302 這樣的非 200 狀態。後端
nginx proxy cache 緩存配置api
配置樣例緩存
proxy_cache_path /home/work/nginx/proxy_cache levels=1:2 keys_zone=cache:2g inactive=2d max_size=8g; location ~ ^/api { proxy_buffering on; proxy_upstream_tries 2; proxy_cache cache; proxy_cache_valid 200 304 15m; proxy_cache_key $host$uri?Accept-Encoding=$http_accept_encoding; proxy_ignore_headers "Cache-Control" "Expires" ; }
配置項說明
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 裏能夠添加緩存命中狀態,便於查看是否命中,統計緩存命中率,具體能夠以下定義格式:服務器
log_format main '$remote_addr - $remote_user [$time_local] "$host|$request" $status $body_bytes_sent ' '$request_length $request_body "$http_referer" "$http_user_agent" "$scheme" "$http_x_forwarded_for" ' '"$upstream_cache_status" "$http_accept_encoding" "$upstream_addr" "$request_time_usec" "$request_time_msec" ' '"$request_time" "$upstream_response_time"';
$upstream_cache_status 包含如下幾種狀態:
MISS:未命中,請求被傳到後端
HIT:緩存命中
EXPIRED:緩存過時,請求被傳到後端
UPDATING:緩存正在更新,使用舊緩存應答
STALE:後端將獲得過時的應答網絡
故障時利用 cache 對服務降級ide
當調用後端接口暫時故障時,好比用手機看視頻拿不到播放數據,或者不出廣告,這時候若是有 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