2012-03-07 40 views
0

開始光油後,我訪問了一次網站。填充所有頁面後,重新瀏覽所有頁面變得如此之快。爲什麼我有這種感覺,光油正在緩存只有同一用戶訪問的頁面

但是,當我切換到另一臺計算機並訪問該網站時,似乎我必須重新啓動此緩存填充過程。

如此看來,光油不服務由其他用戶

我希望我已經清楚地解決我的問題緩存緩存的網頁。

有誰知道發生了什麼事。

這裏是VCL文件

backend Tserver { 
    .host = "127.0.0.1"; 
    .port = "8080"; 
} 

acl purge { 
    "localhost"; 
    "127.0.0.1"; 
    "192.168.3.0"/24; 
} 

sub vcl_recv { 
    if (req.request == "PURGE") { 
      if (!client.ip ~ purge) { 
        error 405 "Not allowed."; 
      } 
      return(lookup); 
    } 

    #without this, the whole logged in status is messed up 
    remove req.http.X-Forwarded-For; 
    set req.http.X-Forwarded-For = client.ip; 

    // Remove has_js and Google Analytics cookies 
    set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_a-z]+|has_js)=[^;]*",""); 

    #if(req.http.Authorization || req.http.Cookie) { 
    # /* Not cachable by default */ 
    # return (pass); 
    #} 

    // remove a ";" prefix, if present 
    #set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", ""); 

    // remove empty cookies. 
    #if (req.http.Cookie ~ "^\s*$") { 
    # unset req.http.Cookie; 
    #} 

    // Skip the Vanish cache for install, update, and cron 
    if (req.url ~ "install\.php|update\.php|cron\.php") { 
    return (pass); 
    } 


    # Normalize Accept-Encoding to get better cache coherency 
    if (req.http.Accept-Encoding) { 
    # No point in compressing media that is already compressed 
    if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") { 
     remove req.http.Accept-Encoding; 
     # MSIE 6 JS bug workaround 
    } elsif(req.http.User-Agent ~ "MSIE 6") { 
     unset req.http.Accept-Encoding; 
    } elsif (req.http.Accept-Encoding ~ "gzip") { 
     set req.http.Accept-Encoding = "gzip"; 
    } elsif (req.http.Accept-Encoding ~ "deflate") { 
     set req.http.Accept-Encoding = "deflate"; 
    } else { 
     # unkown algorithm 
     remove req.http.Accept-Encoding; 
    } 
    } 

    #if (req.url ~ "^/classifieds") { 
    # return(pipe); 
    #} 

    #if (req.url ~ "^/logout") { 
    # return(pipe); 
    #} 

    #if (req.url ~ "^/admin") { 
    # return(pipe); 
    #} 

    # Remove the incoming Cookie header from anonymous requests 
    # This is from Drupal 7 book, not sure if this works here 
    #if (req.http.Cookie !~ "(^|;\s*)SESS") { 
    # unset req.http.Cookie; 
    #} 
/* 
    if (req.http.Cookie) { 
    set req.http.Cookie = ";" req.http.Cookie; 
    set req.http.Cookie = regsuball(req.http.Cookie, "; +", ";"); 
    set req.http.Cookie = regsuball(req.http.Cookie, ";(LOGGED_IN|VARNISH)=", "; \1="); 
    set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", ""); 
    set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", ""); 

    if (req.http.Cookie == "") { 
     remove req.http.Cookie; 
    } 
    } 
*/ 

    # ... other vcl_recv rules here ... 
    # Don't serve cached content to logged-in users 
    # Don't cache Drupal logged-in user sessions 
    # LOGGED_IN is the cookie that earlier version of Pressflow sets 
    # VARNISH is the cookie which the varnish.module sets 

    if (req.http.Cookie ~ "(VARNISH|DRUPAL_UID|LOGGED_IN)") { 
    return (pipe); 
    } 

    // Let's have a little grace 
    // When backend cannot generate refreshed content 
    // this time will allow expired content to stay longer in grace 
    set req.grace = 0s; 

    if (req.http.host ~ "^www.test1.com") { 
      set req.backend = Tserver; 
      if (req.request != "GET" && req.request != "HEAD") { 
        return(pipe); 
      } 
      else { 
        return(lookup); 
      } 
    }elsif (req.http.host ~ "^www.test2.com") { 
      set req.backend = Tserver; 
      if (req.request != "GET" && req.request != "HEAD") { 
        return(pipe); 
      } 
      else { 
        return(lookup); 
      } 
    } 
    else { 
      error 404 "T Cache Server IS Out of Order"; 
      return(lookup); 
    } 

    # Drupal js/css doesn't need cookies, cache them 
    if (req.url ~ "^/modules/.*\.(js|css)\?") { 
      unset req.http.Cookie; 
    } 


    ## Pass cron jobs and server-status 
    if (req.url ~ "cron.php") { 
      return (pass); 
    } 
    if (req.url ~ ".*/server-status$") { 
      return (pass); 
    } 

} 

sub vcl_hash { 
    if (req.http.Cookie) { 
    set req.hash += req.http.Cookie; 
    } 
} 

sub vcl_hit { 
    if (req.http.Cookie ~ "LOGGED_IN") { 
      set obj.ttl = 0s; 
      return (pass); 
    } 

    if (req.request == "PURGE") { 
      set obj.ttl = 0s; 
      error 200 "Purged."; 
    } 
} 

sub vcl_miss { 
    if (req.request == "PURGE") { 
      error 404 "Not in cache."; 
    } 
} 

sub vcl_fetch { 
    if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") { 
    unset beresp.http.set-cookie; 
    } 


    #if (beresp.http.Pragma ~ "nocache") { 
    # return(pass); 
    #} 

    if (req.request == "GET" && req.url ~ "\.(txt|js)$") { 
      set beresp.ttl = 3600s; 
    } 
    elseif (req.http.Cookie ~ "LOGGED_IN") { 
      set beresp.ttl = 0s; 
    } 
    else { 
      // cache time is 30 days then in varnish 
      set beresp.ttl = 30d; 
    } 

} 

sub vcl_error { 
    set obj.http.Content-Type = "text/html; charset=utf-8"; 
    set obj.http.Retry-After = "5"; 
    synthetic {"<?xml version="1.0" encoding="utf-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html><head><title>"} obj.status " " obj.response {"</title></head><body><h1>Error "} obj.status " " obj.response {"</h1><p>"} obj.response {"</p><h3>Guru Meditation:</h3><p>XID: "} req.xid {"</p><hr><p>Varnish cache server</p></body></html>"}; 
    return (deliver); 
} 

sub vcl_pipe { 
    # http://www.varnish-cache.org/ticket/451 
    # This forces every pipe request to be the first one. 
    set bereq.http.connection = "close"; 
} 
+0

我自己找到了解決方案。實際上,因爲我使用Pressflow,服務器在每次首次訪問時都嘗試設置一個cookie。所以在我的測試中,我需要首先清理舊的緩存,並且在Varnish VCL中,在vcl_fetch中,我還沒有設置beresp.http.Set-Cookie – Hao 2012-03-07 14:01:14

回答

1

你有一個特定用戶(會話)的cookie,即使用戶被註銷?

1

你的後端可能吐出「Vary:User-Agent」或「Vary:Accept-Encoding」或類似的東西。這基本上告訴Varnish爲每個用戶分別緩存東西。修復後端或標準化有問題的頭文件。