http塊: php
proxy_cache_path /tmp/cache levels=1:2 keys_zone=nuget-cache:20m max_size=50g inactive=168h; html
server塊: nginx
proxy_cache nuget-cache;web
下附nginx緩存優先級瀏覽器
接觸nginx的兄弟或多或少都有遇到緩存問題,要麼是nginx爲何不緩存,要麼就是nginx緩存很快就失效等等問題,在網上找了一遍nginx緩存優先級的文章,你們能夠參考下。緩存
架構圖
client端 <------------------> nginx cache <------------------>源服務器服務器
通過大量測試發現:nginx的過時順序是有一個優先級的。下面首先說明各個影響緩存過時的因素:cookie
(1)inactive:在proxy_cache_path配置項中進行配置,說明某個緩存在inactive指定的時間內若是不訪問,將會從緩存中刪除。
(2)源服務器php頁面中生成的響應頭中的Expires,生成語句爲:
header("Expires: Fri, 07 Sep 2013 08:05:18 GMT");
(3)源服務器php頁面生成的max-age,生成語句爲:
header("Cache-Control: max-age=60");
(4)nginx的配置項 proxy_cache_valid:配置nginx cache中的緩存文件的緩存時間,若是配置項爲:proxy_cache_valid 200 304 2m;說明對於狀態爲200和304的緩存文件的緩存時間是2分鐘,兩分鐘以後再訪問該緩存文件時,文件會過時,從而去源服務器從新取數據。架構
其次對須要注意的一點:源服務器的expires和nginx cache的expires配置項的衝突進行說明,場景以下jsp
(1)源服務器端有php文件ta1.php內容以下:
(2)在nginx cache服務器端的配置信息以下:
從上面兩項能夠看出nginx cache 服務器中expires的配置是30s,該expires的值直接決定了在瀏覽器端看到的max-age以及expires的值。而源服務器斷的代碼中設置的響應頭中的max-age爲60,expires爲Fri, 07 Sep 2013 08:05:18 GMT。這是源服務器的設置於nginx-cache的設置衝突了,那麼着兩個屬性應該怎麼設置呢?
這時client端的max-age與expires的值按照nginx cache中的expires配置項的設置,即:
而nginx cache端的緩存的max-age與expire的值按照源服務器上的代碼的設置。即:
如今步入正題:
通過大量測試發現:對緩存的過時與清除起做用的因素的優先級從高到低一次爲:
inactive配置項、源服務器設置的Expires、源服務器設置的Max-Age、proxy_cache_valid配置項
下面經過幾個實例對這幾個優先級進行說明
實例1:
服務器端php代碼:
nginx cache 配置項
inactive 4m//4分鐘
proxy_cache_valid 1m//1分鐘
現象:第一次訪問頁面ta1.php以後,各個時間的訪問結果:
1分鐘以後 :HIT//這說明valid沒有起做用
2分鐘以後 :HIT//這說明 源服務器設置的max-age沒有起做用
3分鐘以後:MISS//這說明源服務器設置的Expires起做用了
4分鐘以後:MISS//這說明inactive起做用了
實例2:
服務器端php代碼:
nginx cache 配置項
inactive 10s//10秒鐘
proxy_cache_valid 1m//1分鐘
現象:第一次訪問頁面ta1.php以後,各個時間的訪問結果:
5秒後訪問:HIT
10秒後訪問: MISS
15秒後訪問:HIT
20秒後訪問:MISS
經過實例1和實例2綜合分析:若是inactive已經進行了設置,則緩存的過時時間以inactive設置的值爲準
實例3:
服務器端php代碼:
nginx cache 配置項
inactive 4m//4分鐘
proxy_cache_valid 1m//1分鐘
現象:第一次訪問頁面ta1.php以後,各個時間的訪問結果:
每隔一秒訪問一次:MISS//這說明源服務器端設置的Expires屏蔽了nginx的valide和源服務器端設置的max-age的做用
實例4:
服務器端php代碼:
nginx cache 配置項
inactive 4m//4分鐘
proxy_cache_valid 1m//1分鐘
現象:第一次訪問頁面ta1.php以後,各個時間的訪問結果:
1分鐘以後 : HIT//這說明valid沒有起做用,由於源服務器設置的Expires將valid的效果屏蔽了
2分鐘以後 : HIT//這說明 源服務器設置的max-age沒有起做用,由於源服務器設置的Expires將max-age屏蔽了
3分鐘以後: MISS//這說明服務器端設置的expires起做用了
經過實例2和實例3的現象說明:若是inactive設置的比較大,在inactive到期以前,若是valid、服務器端設置的expires、服務器端設置的max-age都進行了設置,則以服務器端設置的expires爲準。
實例5:
服務器端php代碼:
nginx cache 配置項
inactive 4m//4分鐘
#下面兩行用於消除服務器端配置的Expires響應頭的影響
proxy_ignore_headers "Expires";
proxy_hide_header "Expires";
proxy_cache_valid 1m//1分鐘
現象:第一次訪問頁面ta1.php以後,各個時間的訪問結果:
1分鐘以後 HIT //這說明valid的做用已經被服務器端的max-age屏蔽
2分鐘以後 MISS//服務器端設置的max-age起做用
實例6:
服務器端php代碼:
nginx cache 配置項
inactive 4m//4分鐘
#下面兩行用於消除服務器端配置的Expires響應頭的影響
proxy_ignore_headers "Expires";
proxy_hide_header "Expires";
proxy_cache_valid 2m//2分鐘
現象:第一次訪問頁面ta1.php以後,各個時間的訪問結果:
50秒鐘以後 : MISS//這說明服務器端配置的max-age起做用
1分鐘以後 : HIT//
100秒鐘以後: MISS//這說明服務器端設置的max-age起做用了
經過實例5和實例6的現象說明:若是inactive設置的比較大,並且在nginx配置文件中取消服務器端Expires對緩存的影響。在同時設置了proxy_cache_valid和服務器端設置了max-age響應頭字段的狀況下,以服務器端設置的max-age的值爲標準進行緩存過時處理。
綜上所述:
(1)在同時設置了源服務器端Expires、源服務器端max-age和nginx cahe端的proxy_cache_valid的狀況下,以源服務器端設置的Expires的值爲標準進行緩存的過時處理(2)若在nginx中配置了相關配置項,取消原服務器端Expires對緩存的影響,在同時設置了源服務器端Expires、源服務器端max-age和nginx cahe端的proxy_cache_valid的狀況下,以源服務器端max-age的值爲標準進行緩存的過時處理(3)若同時取消源服務器端Expires和源服務器端max-age對緩存的影響,則以proxy_cache_valid設置的值爲標準進行緩存的過時處理(4) Inactive的值不受上述三個因素的影響,即第一次請求頁面以後,每通過inactvie指定的時間,都要強制進行相應的緩存清理。所以inactive的優先級最高。(5)因此對緩存過時影響的優先級進行排序爲:inactvie、源服務器端Expires、源服務器端max-age、proxy_cache_valid