Nginx Proxy Cache原理和最佳實(shí)踐


最近正將varnish上的cache policy遷移到nginx proxy cache上盛卡,并為后續(xù)使用memorycached緩存做好準(zhǔn)備垫蛆,下文對最近的工作進(jìn)行下梳理和總結(jié)种蘸,歡迎糾錯和探討:

1. 基礎(chǔ)

* 緩存概念

圖一:nginx緩存原理
圖一:nginx緩存原理

悶著頭皮做了好幾天,將最初的配置模版寫出來了,但是忽略了最重要的一點(diǎn):Basic Principles,所以讓我老大批評了一頓芭毙,并改了不少東西,痛定思痛卸耘,開始看原理:上圖是用戶訪問website流程圖(nginx為proxy)
當(dāng)?shù)谝粋€(gè)用戶(藍(lán))訪問網(wǎng)站退敦,他的請求首先會到NGINX PROXY SERVER,隨后NGNIX發(fā)往后端服務(wù)器(灰),后端會將請求的響應(yīng)首先發(fā)往NGINX鹊奖,由其返回給用戶(藍(lán)色)苛聘,如果這個(gè)響應(yīng)是可以緩存的,則NGINX會保留一份響應(yīng)的副本忠聚,當(dāng)其他用戶(橙色)發(fā)起相同的request請求時(shí)设哗,NGINX會根據(jù)request請求的內(nèi)容是否存在于緩存中,來直接返回給用戶两蟀,不經(jīng)過后端网梢。
這個(gè)場景同樣適用于瀏覽器,CDN赂毯,用于緩存靜態(tài)資源战虏。

* HTTP緩存機(jī)制

后端服務(wù)器會通過響應(yīng)包頭來定義緩存特性:


圖二:Origin Server定義的緩存特性
圖二:Origin Server定義的緩存特性

當(dāng)然,緩存服務(wù)器可以通過設(shè)置一些參數(shù)來忽略或者重寫后端服務(wù)器的緩存特性党涕,但后端服務(wù)器的緩存特性也是極其重要的烦感。

.Expires: 最原始的配置策略,即設(shè)置過期時(shí)間膛堤,但使用效率低下手趣,目前絕大部分已經(jīng)被Cache-Control(有興趣的可以去看下http1.0和http1.1);

.Cache-Control:定義緩存資源屬性是private或者是public肥荔,并且設(shè)置緩存多久后過期绿渣,本例中朝群,屬性為public,60秒過期中符;

.X-Accel-Expires: 只有nginx能識別的緩存特性header姜胖,優(yōu)先級大于上面兩個(gè)header,可以設(shè)置此header淀散,在nginx側(cè)來重新定義緩存特性右莱;

.Etag和Last-Modified是捆綁生成的: 有些場景下,你希望client端的瀏覽器長時(shí)間緩存吧凉,而緩存服務(wù)器只短時(shí)間緩存文件隧出,以至于當(dāng)后端服務(wù)器更新后,緩存服務(wù)器會及時(shí)同步阀捅,我們就可以使用最后兩個(gè)header胀瞪,Last-Modified表示最后修改時(shí)間,并聲明一個(gè)ETag(哈希值)饲鄙,做為緩存內(nèi)容的標(biāo)簽凄诞,具有唯一性;客戶端訪問請求帶有If?Modified?Since或者If?None?Match header,并申明自己的客戶端帶有靜態(tài)緩存文件,以及文件修改日期和ETag值忍级,如果服務(wù)器端的版本和Etag值與客戶端一致帆谍,則服務(wù)端會直接返回304 not modified,這個(gè)驗(yàn)證流程是非持嵩郏快的汛蝙,并且節(jié)省網(wǎng)絡(luò)帶寬;

.如果Cache-Control設(shè)置為public朴肺,則客戶端不會去驗(yàn)證資源的有效性窖剑,將會一直使用直到過期,同時(shí)public也代表資源可以被緩存在web proxy中戈稿;

.如果Cache-Control包含must-revalidate西土,則客戶端每一次訪問請求資源都會去驗(yàn)證緩存是否有更新;

* NGINX都會緩存哪些資源

2. 最佳實(shí)踐

首先看下nginx proxy cache最基本的配置:

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
???? set $upstream http://ip:port
???? ???? location / {
???? ???????? ???? proxy_cache my_cache;
???? ???????? ???? proxy_pass $upstream; }
???? ????}

配置項(xiàng)說明:

  • /path/to/cache : 本地路徑鞍盗,緩存文件存放地址需了;
  • levels : 默認(rèn)所有緩存文件都放在同一個(gè)/path/to/cache下,從而影響緩存的性能般甲,大部分場景推薦使用2級目錄來存儲緩存文件肋乍;
  • key_zone : 在共享內(nèi)存中設(shè)置一塊存儲區(qū)域來存放緩存的key和metadata(類似使用次數(shù)),這樣nginx可以快速判斷一個(gè)request是否命中或者未命中緩存敷存,1m可以存儲8000個(gè)key住拭,10m可以存儲80000個(gè)key;
  • max_size : 最大cache空間,如果不指定滔岳,會使用掉所有disk space,當(dāng)達(dá)到配額后挽牢,會刪除最少使用的cache文件谱煤;
  • inactive : 未被訪問文件在緩存中保留時(shí)間,本配置中如果60分鐘未被訪問則不論狀態(tài)是否為expired禽拔,緩存控制程序會刪掉文件刘离,默認(rèn)為10分鐘;“需要注意的是睹栖,inactive和expired配置項(xiàng)的含義是不同的硫惕,expired只是緩存過期,但不會被刪除野来,inactive是刪除指定時(shí)間內(nèi)未被訪問的緩存文件”恼除;
  • use_temp_path : 如果為off,則nginx會將緩存文件直接寫入指定的cache文件中曼氛,而不是使用temp_path存儲豁辉,official建議為off,避免文件在不同文件系統(tǒng)中不必要的拷貝舀患;
  • proxy_cache : 啟用proxy cache徽级,指定key_zone;

附:緩存和代理中常用的配置項(xiàng)

上文講述了如何配置最基礎(chǔ)的proxy cache,接下來聊浅,會對常用的高級配置項(xiàng)進(jìn)行梳理餐抢。

  • proxy_no_cache string;

Default: —
Context: http , server , location
config example:
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
proxy_no_cache $http_pragma $http_authorization;

$cookie_nocache $arg_nocache...皆為變量,可以根據(jù)你訪問的匹配策略來設(shè)置低匙,其值只有2類旷痕,0和非0;
訪問匹配策略例如:
if ($request_uri ~ ^/(login|register|password\/reset)/) { set $cookie_nocache 1; }
如果在此鏈?zhǔn)脚渲弥校灰幸粋€(gè)值不為0努咐,則不會cache苦蒿;例如:proxy_no_cache $cookie_nocache(0) $arg_nocache(1) $arg_comment(0),不會被cache渗稍。`
注:一般會配合proxy_cache_bypass共同使用佩迟;

  • proxy_cache_bypass string;

Default: —
Context: http , server , location
config example:
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
proxy_cache_bypass $http_pragma $http_authorization;

定義在哪些情況下不從cache讀取,直接從backend獲取資源竿屹;配置方式同proxy_no_cache报强。

  • proxy_cache_key string;

Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location

自定義cache key,例如:
proxy_cache_key "$host$request_uri $cookie_user";
默認(rèn)值為:
proxy_cache_key $scheme$proxy_host$uri$is_args$args;

  • proxy_cache_methods GET| HEAD|POST...;

Default: proxy_cache_methods GET HEAD;
Context: http, server, location

指定客戶端那些方法被緩存拱燃,默認(rèn)為GET|HEAD秉溉。

  • proxy_cache_purge string ...;

Default: —
Context: http, server, location
config example:
proxy_cache_path /data/nginx/cache keys_zone=cache_zone:10m;
map $request_method $purge_method {
???? PURGE 1;
???? default 0;
}
server {
???? ...
???? location / {
???? ???? proxy_pass http://backend;
???? ???? proxy_cache cache_zone;
???? ???? proxy_cache_key $uri;
???? ???? proxy_cache_purge $purge_method;
???? }
}

定義緩存清除場景,同proxy_no_cacheproxy_cache_bypass鏈?zhǔn)脚渲梅绞秸偎唬灰忠粋€(gè)不為0父晶,則清除對應(yīng)的cache key則會被清除,并返回204 response弄跌。注意甲喝,這里是刪除內(nèi)存中的cache key,而不是disk上的cache文件n踔弧2号帧!disk的cache文件是由inactive控制淳玩;
當(dāng)purege request的cache key以通配符*結(jié)束時(shí)直撤,所有匹配到通配符的cache入口的cachekey都會被刪除。

  • proxy_cache_valid *[code...] time *;

Default: —
Context: http, server, location

設(shè)置不同相應(yīng)碼的緩存時(shí)間蜕着,當(dāng)不指定響應(yīng)碼的時(shí)候谋竖,例如
proxy_cache_valid 5m;
只對響應(yīng)碼為200,301侮东,302的訪問請求資源設(shè)置緩存時(shí)間圈盔,此外可以個(gè)性化定制,例如:
proxy_cache_valid 200 302 10m; proxy_cache_valid 301 1h; proxy_cache_valid 404 1m; proxy_cache_valid any 1m;
此外悄雅,還可以在相應(yīng)header里設(shè)置優(yōu)先級更高的緩存有效時(shí)間:

  1. “X-Accel-Expires”,設(shè)置響應(yīng)的緩存過期時(shí)間驱敲,以秒為單位;0為不緩存宽闲;
  2. 如果沒有設(shè)置“X-Accel-Expires” header众眨,則關(guān)于緩存的配置策略可能會在“Expires”或者“Cache-Control” header中;
  3. 如果header含有“Set-Cookie”,則響應(yīng)不會被緩存容诬,類似的配置可以在“proxy_ignore_header”中可見娩梨;
  4. header包含“Vary”并且設(shè)置為“*”,則請求不會被緩存览徒,如果“Vary”有具體的值狈定,則對應(yīng)的請求會被緩存;
  • proxy_ignore_headers field习蓬;

Default: —
Context: http, server, location

不緩存包含在field的響應(yīng)header纽什,可以設(shè)置的值有:“X-Accel-Redirect”, “X-Accel-Expires”, “X-Accel-Limit-Rate”,“X-Accel-Buffering”, “X-Accel-Charset”, “Expires”, “Cache-Control”, “Set-Cookie” (0.8.44), and “Vary”躲叼。
如果上述的header field沒有設(shè)置為忽略芦缰,則header filed中有“X-Accel-Expires”, “Expires”, “Cache-Control”, “Set-Cookie”, and “Vary”的話,響應(yīng)會被緩存枫慷。

  • proxy_pass_headers field让蕾;
  • proxy_hide_headers field浪规;

Default: —
Context: http, server, location


參考: 1.http://czerasz.com/2015/03/30/nginx-caching-tutorial/ 2.https://www.nginx.com/blog/nginx-caching-guide/ 3.https://www.nginx.com/blog/nginx-high-performance-caching/ 4.http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_headers 5.http://www.slideshare.net/Nginx/nginx-highperformance-caching 6.https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching 7.http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_proxy_module.html#proxy_ignore_headers 8.https://forum.nginx.org/read.php?2,265703,265704#msg-265704

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市探孝,隨后出現(xiàn)的幾起案子笋婿,更是在濱河造成了極大的恐慌,老刑警劉巖再姑,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萌抵,死亡現(xiàn)場離奇詭異,居然都是意外死亡元镀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門霎桅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來栖疑,“玉大人,你說我怎么就攤上這事滔驶∮龈铮” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵揭糕,是天一觀的道長萝快。 經(jīng)常有香客問我,道長著角,這世上最難降的妖魔是什么揪漩? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮吏口,結(jié)果婚禮上奄容,老公的妹妹穿的比我還像新娘。我一直安慰自己产徊,他們只是感情好昂勒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舟铜,像睡著了一般戈盈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谆刨,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天塘娶,我揣著相機(jī)與錄音,去河邊找鬼痴荐。 笑死血柳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的生兆。 我是一名探鬼主播难捌,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼膝宁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了根吁?” 一聲冷哼從身側(cè)響起员淫,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎击敌,沒想到半個(gè)月后介返,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沃斤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年圣蝎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衡瓶。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡徘公,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哮针,到底是詐尸還是另有隱情关面,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布十厢,位于F島的核電站等太,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蛮放。R本人自食惡果不足惜缩抡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望筛武。 院中可真熱鬧缝其,春花似錦、人聲如沸徘六。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽待锈。三九已至漠其,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間竿音,已是汗流浹背和屎。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留春瞬,地道東北人柴信。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像宽气,于是被迫代替她去往敵國和親随常。 傳聞我的和親對象是個(gè)殘疾皇子潜沦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Nginx簡介 解決基于進(jìn)程模型產(chǎn)生的C10K問題,請求時(shí)即使無狀態(tài)連接如web服務(wù)都無法達(dá)到并發(fā)響應(yīng)量級一萬的現(xiàn)...
    魏鎮(zhèn)坪閱讀 2,000評論 0 9
  • 1.簡介: ? Nginx:engine X ,2002年绪氛,開源唆鸡,商業(yè)版? http協(xié)議:web服務(wù)器(類似于ht...
    尛尛大尹閱讀 1,867評論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)枣察,斷路器争占,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 上一篇《WEB請求處理一:瀏覽器請求發(fā)起處理》,我們講述了瀏覽器端請求發(fā)起過程序目,通過DNS域名解析服務(wù)器IP臂痕,并建...
    七寸知架構(gòu)閱讀 80,990評論 21 356
  • 微信最新版已經(jīng)更新刻蟹,讓外界最期待的就是微信小程序功能。所謂小程序就是類似于微信公眾號嘿辟,每一個(gè)APP可以像微信公眾號...
    斑點(diǎn)魚閱讀 180評論 0 0