1. 程式人生 > >nginx快取設定proxy_cache nginx快取設定proxy_cache

nginx快取設定proxy_cache nginx快取設定proxy_cache

nginx快取設定proxy_cache http://www.cnblogs.com/dudu/p/4597351.html

 

http塊: 

        proxy_cache_path /tmp/cache levels=1:2 keys_zone=nuget-cache:20m max_size=50g inactive=168h; 

 

server塊: 

        proxy_cache nuget-cache;

        proxy_cache_valid 168h;         proxy_ignore_headers Set-Cookie Cache-Control;   #這句程式碼很關鍵,尤其要忽略set-cookie         proxy_hide_header Cache-Control;         proxy_hide_header Set-Cookie;

 

 

 

 

下附nginx快取優先順序

接觸nginx的兄弟或多或少都有遇到快取問題,要麼是nginx為什麼不快取,要麼就是nginx快取很快就失效等等問題,在網上找了一遍nginx快取優先順序的文章,大家可以參考下。

架構圖
client端  <------------------>   nginx cache <------------------>源伺服器

經過大量測試發現:nginx的過期順序是有一個優先順序的。下面首先說明各個影響快取過期的因素:

(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配置項的衝突進行說明,場景如下

(1)源伺服器端有php檔案ta1.php內容如下:

  <td "="" data-settings="hide">123456
<?php header("Expires: Fri, 07 Sep 2013 08:05:18 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: max-age=60"); <span "="">echo "ta1"; ?>

(2)在nginx cache伺服器端的配置資訊如下:

  <td "="" data-settings="hide">1234567891011121314151617181920212223242526
……. proxy_cache_path  /data0/proxy_cache_dir  levels=1:2   keys_zone=cache_one:200m inactive=5s max_size=30g; ……..   location ~ .*\.(php|jsp|cgi)$ {     proxy_read_timeout 10s;     proxy_connect_timeout 10s;     proxy_set_header Host $host;     proxy_cache_use_stale updating;     proxy_cache_key $host$uri$is_args$args;     proxy_cache cache_one;     #proxy_ignore_headers "Cache-Control";     #proxy_hide_header "Cache-Control";     #proxy_ignore_headers "Expires";     #proxy_hide_header "Expires";     proxy_hide_header "Set-Cookie";     proxy_ignore_headers "Set-Cookie";     #add_header Cache-Control max-age=60;     add_header X-Cache '$upstream_cache_status from $server_addr';     proxy_cache_valid 200 304 2m;     #proxy_cache_valid any 0m;     proxy_pass http://backend_server;     expires 30s; } ………….

從上面兩項可以看出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配置項的設定,即:

  <td "="" data-settings="hide">12
Expires  Fri, 07 Sep 2012 08:59:16 GMT Cache-Controlmax-age=30

而nginx cache端的快取的max-age與expire的值按照源伺服器上的程式碼的設定。即:

  <td "="" data-settings="hide">12
Expires  Fri, 07 Sep 2013 08:05:18 GMT Cache-Controlmax-age=60

現在步入正題:

經過大量測試發現:對快取的過期與清除起作用的因素的優先順序從高到低一次為:
inactive配置項、源伺服器設定的Expires、源伺服器設定的Max-Age、proxy_cache_valid配置項
下面通過幾個例項對這幾個優先順序進行說明

例項1:
伺服器端php程式碼:

  <td "="" data-settings="hide">1234567
<?php header("Expires: Fri, 07 Sep 2012 08:03:18 GMT");//其實是3分鐘之後 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: max-age=180");//2分鐘 //header("Cache-Control: post-check=0, pre-check=0", false); <span "="">echo "ta1"; ?>

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程式碼:

  <td "="" data-settings="hide">1234567
<?php header("Expires: Fri, 07 Sep 2012 08:03:18 GMT");//3分鐘之後 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: max-age=180");//2分鐘 //header("Cache-Control: post-check=0, pre-check=0", false); <span "="">echo "ta1"; ?>

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程式碼:

  <td "="" data-settings="hide">1234567
<?php header("Expires: Fri, 07 Sep 1977 08:03:18 GMT");//直接過期 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: max-age=120");//2分鐘 //header("Cache-Control: post-check=0, pre-check=0", false); <span "="">echo "ta1"; ?>

nginx cache 配置項
inactive 4m//4分鐘
proxy_cache_valid 1m//1分鐘
現象:第一次訪問頁面ta1.php之後,各個時間的訪問結果:
每隔一秒訪問一次:MISS//這說明源伺服器端設定的Expires遮蔽了nginx的valide和源伺服器端設定的max-age的作用

例項4:
伺服器端php程式碼:

  <td "="" data-settings="hide">1234567
<?php header("Expires: Fri, 07 Sep 2012 08:03:18 GMT");//3分鐘之後 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: max-age=120");//2分鐘 //header("Cache-Control: post-check=0, pre-check=0", false); <span "="">echo "ta1"; ?>

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程式碼:

  <td "="" data-settings="hide">1234567
<?php header("Expires: Fri, 07 Sep 2012 08:03:18 GMT");//3分鐘之後 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: max-age=120");//2分鐘 //header("Cache-Control: post-check=0, pre-check=0", false); <span "="">echo "ta1"; ?>

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程式碼:

  <td "="" data-settings="hide">1234567
<?php header("Expires: Fri, 07 Sep 2012 08:03:18 GMT");//3分鐘之後 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: max-age=50");//50秒鐘 //header("Cache-Control: post-check=0, pre-check=0", false); <span "="">echo "ta1"; ?>

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

 

http://www.cnblogs.com/dudu/p/4597351.html

 

http塊: 

        proxy_cache_path /tmp/cache levels=1:2 keys_zone=nuget-cache:20m max_size=50g inactive=168h; 

 

server塊: 

        proxy_cache nuget-cache;

        proxy_cache_valid 168h;         proxy_ignore_headers Set-Cookie Cache-Control;   #這句程式碼很關鍵,尤其要忽略set-cookie         proxy_hide_header Cache-Control;         proxy_hide_header Set-Cookie;

 

 

 

 

下附nginx快取優先順序

接觸nginx的兄弟或多或少都有遇到快取問題,要麼是nginx為什麼不快取,要麼就是nginx快取很快就失效等等問題,在網上找了一遍nginx快取優先順序的文章,大家可以參考下。

架構圖
client端  <------------------>   nginx cache <------------------>源伺服器

經過大量測試發現:nginx的過期順序是有一個優先順序的。下面首先說明各個影響快取過期的因素:

(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配置項的衝突進行說明,場景如下

(1)源伺服器端有php檔案ta1.php內容如下:

  <td "="" data-settings="hide">123456
<?php header("Expires: Fri, 07 Sep 2013 08:05:18 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: max-age=60"); <span "="">echo "ta1"; ?>

(2)在nginx cache伺服器端的配置資訊如下:

  <td "="" data-settings="hide">1234567891011121314151617181920212223242526
……. proxy_cache_path  /data0/proxy_cache_dir  levels=1:2   keys_zone=cache_one:200m inactive=5s max_size=30g; ……..   location ~ .*\.(php|jsp|cgi)$ {     proxy_read_timeout 10s;     proxy_connect_timeout 10s;     proxy_set_header Host $host;     proxy_cache_use_stale updating;     proxy_cache_key $host$uri$is_args$args;     proxy_cache cache_one;     #proxy_ignore_headers "Cache-Control";     #proxy_hide_header "Cache-Control";     #proxy_ignore_headers "Expires";     #proxy_hide_header "Expires";     proxy_hide_header "Set-Cookie";     proxy_ignore_headers "Set-Cookie";     #add_header Cache-Control max-age=60;     add_header X-Cache '$upstream_cache_status from $server_addr';     proxy_cache_valid 200 304 2m;     #proxy_cache_valid any 0m;     proxy_pass http://backend_server;     expires 30s; } ………….

從上面兩項可以看出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配置項的設定,即:

  <td "="" data-settings="hide">12
Expires  Fri, 07 Sep 2012 08:59:16 GMT Cache-Controlmax-age=30

而nginx cache端的快取的max-age與expire的值按照源伺服器上的程式碼的設定。即:

  <td "="" data-settings="hide">12
Expires  Fri, 07 Sep 2013 08:05:18 GMT Cache-Controlmax-age=60

現在步入正題:

經過大量測試發現:對快取的過期與清除起作用的因素的優先順序從高到低一次為:
inactive配置項、源伺服器設定的Expires、源伺服器設定的Max-Age、proxy_cache_valid配置項
下面通過幾個例項對這幾個優先順序進行說明

例項1:
伺服器端php程式碼:

  <td "="" data-settings="hide">1234567
<?php header("Expires: Fri, 07 Sep 2012 08:03:18 GMT");//其實是3分鐘之後 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: max-age=180");//2分鐘 //header("Cache-Control: post-check=0, pre-check=0", false); <span "="">echo "ta1"; ?>

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程式碼:

  <td "="" data-settings="hide">1234567
<?php header("Expires: Fri, 07 Sep 2012 08:03:18 GMT");//3分鐘之後 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: max-age=180");//2分鐘 //header("Cache-Control: post-check=0, pre-check=0", false); <span "="">echo "ta1"; ?>

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程式碼:

  <td "="" data-settings="hide">1234567
<?php header("Expires: Fri, 07 Sep 1977 08:03:18 GMT");//直接過期 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: max-age=120");//2分鐘 //header("Cache-Control: post-check=0, pre-check=0", false); <span "="">echo "ta1"; ?>

nginx cache 配置項
inactive 4m//4分鐘
proxy_cache_valid 1m//1分鐘
現象:第一次訪問頁面ta1.php之後,各個時間的訪問結果:
每隔一秒訪問一次:MISS//這說明源伺服器端設定的Expires遮蔽了nginx的valide和源伺服器端設定的max-age的作用

例項4:
伺服器端php程式碼:

  <td "="" data-settings="hide">1234567
<?php header("Expires: Fri, 07 Sep 2012 08:03:18 GMT");//3分鐘之後 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: max-age=120");//2分鐘 //header("Cache-Control: post-check=0, pre-check=0", false); <span "="">echo "ta1"; ?>

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程式碼:

  <td "="" data-settings="hide">1234567
<?php header("Expires: Fri, 07 Sep 2012 08:03:18 GMT");//3分鐘之後 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: max-age=120");//2分鐘 //header("Cache-Control: post-check=0, pre-check=0", false); <span "="">echo "ta1"; ?>

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程式碼:

  <td "="" data-settings="hide">1234567
<?php header("Expires: Fri, 07 Sep 2012 08:03:18 GMT");//3分鐘之後 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: max-age=50");//50秒鐘 //header("Cache-Control: post-check=0, pre-check=0", false); <span "="">echo "ta1"; ?>

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