2016-10-04 104 views
0

我配置了Nginx緩存,主要工作在Nginx's own documentation關閉。當我撥打應使用curl進行緩存的URL時,它的工作原理與預期完全相同:第一次請求時爲MISS,後續請求時爲HIT。但是,當我在任何主要瀏覽器中調用相同的URL時,每次都會得到MISS - 即使該相同的URL剛被curl調用並被緩存。Nginx代理緩存工作的捲曲,但不是瀏覽器

這裏是我的Nginx的配置:

proxy_cache_path /tmp/nginx levels=1:2 keys_zone=lb_cache:10m inactive=60m use_temp_path=off; 
proxy_cache_key "$request_method$host$request_uri"; 

proxy_cache_lock on; 
proxy_cache_use_stale updating; 

server { 
    location/{ 
     proxy_cache lb_cache; 

     proxy_ignore_headers Expires; 
     proxy_hide_header Expires; 

     proxy_cache_valid 200 60m; 
     proxy_cache_revalidate on; 

     proxy_no_cache $no_cache; 
     proxy_cache_bypass $http_cache_control $http_pragma $cookie_nocache $arg_nocache; 

     add_header X-Cache-Status $upstream_cache_status; 

     proxy_pass http://webservers; 

     if ($request_uri ~* "/(admin/)") { 
      set $no_cache true; 
     } 
     if ($http_cookie ~* "SESS") { 
      set $no_cache true; 
     } 
    } 
} 

我怎樣才能確保始終使用我的緩存,並且它是什麼使使我的緩存錯過的請求時,這是從捲曲不同的瀏覽器?

+0

原因很可能是'proxy_cache_bypass'指令。從瀏覽器中檢查請求標題以獲取「Cache-Control」或「Pragma」。如果存在任何這些內容,Nginx將忽略緩存而不考慮頭部值。我的賭注是「緩存控制」。 –

+0

我不認爲這是問題,因爲當我傳遞其中一個標題時,我看到緩存狀態記錄爲「BYPASS」。當我只是通常請求一個頁面時,即使'curl'顯示同一個URL的'HIT'狀態,我也會得到'MISS'。 – Christiaan

回答

0

問題原來是網站發送的Vary標題。它正在運行Drupal 7,顯然它被配置爲通過Vary頭來緩存自己的緩存。忽略Nginx中的頭部解決了這個問題。

0

curl和瀏覽器的主要區別在於瀏覽器會記住/緩存資源 - 所以cookie可能是負責任的(可能是if ($http_cookie ~* "SESS") { set $no_cache true; }部分),或者瀏覽器在請求中使用的標題會更改緩存使用情況。

我會比較curl和瀏覽器在這種情況下所做的確切請求 - 例如使用Firebug。通過這種方式,您可以找出瀏覽器發送的捲髮不發送的內容。