문제

We're currently running a site with:
Pressflow 5.23.50
Varnish 2.1.4

I suspect some of the problems I'm running to are based on the wide variety of documentation and that some of it is up to date and some of it isn't.

Currently I get these response headers:

Server  Apache/2.2.3 (CentOS)
X-Powered-By    PHP/5.1.6
X-Drupal-Cache  HIT
Etag    "1294852404-1"
Cache-Control   public, max-age=0
Last-Modified   Wed, 12 Jan 2011 17:13:24 GMT
Expires Sun, 19 Nov 1978 05:00:00 GMT
Vary    Cookie,Accept-Encoding
Content-Encoding    gzip
Content-Type    text/html; charset=utf-8
X-Cacheable YES
Content-Length  7621
Date    Wed, 12 Jan 2011 17:59:49 GMT
X-Varnish   1305826372
Age 0
Via 1.1 varnish
Connection  keep-alive
X-Cache MISS

Varnish Config:
We are using the Global Redirect module and I have included the appropriate check as I've found online in it.

backend default {
    .host = "127.0.0.1";
    .port = "7900";
#     .connect_timeout = 600s;
#     .first_byte_timeout = 600s;
#     .between_bytes_timeout = 600s;
#     .max_connections = 25000;
}


sub vcl_recv {
    set req.backend = default;



  set req.grace = 5m;

    remove req.http.X-Forwarded-For;
    set req.http.X-Forwarded-For = client.ip;

    # Properly handle different encoding types
    if (req.http.Accept-Encoding) {
        if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {
            # No point in compressing these
            remove 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;
        }
    }

# Force lookup if the request is a no-cache request from the client
    if (req.http.Cache-Control ~ "no-cache") {
        return (pass);
    }

    ## Default request checks
    if (req.request != "GET" &&
        req.request != "HEAD" &&
        req.request != "PUT" &&
        req.request != "POST" &&
        req.request != "TRACE" &&
        req.request != "OPTIONS" &&
        req.request != "DELETE") {
            # Non-RFC2616 or CONNECT which is weird.
            return (pipe);
    }
    if (req.request != "GET" && req.request != "HEAD") {
        # We only deal with GET and HEAD by default
        return (pass);
    }
    if (req.request != "GET" && req.request != "HEAD") {
        # We only deal with GET and HEAD by default
        return (pass);
    }

    ## Modified from default to allow caching if cookies are set, but not http auth
    if (req.http.Authorization) {
        /* Not cacheable by default */
        return (pass);
    }

    ## Remove has_js and Google Analytics cookies.
    set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(__[a-z]+|has_js)=[^;]*", "");
    ## 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;
    }
    ## Catch Drupal theme files  - THIS BREAKS UPDATE.PHP DO NOT USE
    #if (req.url ~ "^/sites/") {
    #    unset req.http.Cookie;
    #}
    # Catch Drupal misc files (like drupal.js and jquery.js)
    #if (req.url ~ "^/misc/") {
    #    unset req.http.Cookie;
    #}
    # 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);
    }
    ## Don't cache install
    if (req.url ~ "install.php") {
        return (pass);
    }

    # if (req.url ~ "index.php") {
#   unset req.http.Cookie;
#     }

    # This is for Global Redirect.
    if (req.url ~ "node\?page=[0-9]+$") {
             set req.url = regsub(req.url, "node(\?page=[0-9]+$)", "\1");
             return (lookup);
    }

    ## Don't cache Drupal logged-in user sessions
    if (req.http.Cookie ~ "(VARNISH|DRUPAL_UID)") {
        return (pass);
    }

    return (lookup);
}

# Per-session cache
sub vcl_hash { if (req.http.Cookie) { set req.hash += req.http.Cookie; } }

sub vcl_fetch {
    # These status codes should always pass through and never cache.
    if (beresp.status == 404 || beresp.status == 503 || beresp.status == 500) {
        set beresp.http.X-Cacheable = "NO: beresp.status";
        set beresp.http.X-Cacheable-status = beresp.status;
        return (pass);
    }

    # Grace to allow varnish to serve content if backend is lagged
    set beresp.grace = 5m;


    if (!beresp.cacheable) {
        set beresp.http.X-Cacheable = "NO: !beresp.cacheable";
        return (pass);
    }

    # All tests passed, therefore item is cacheable
    set beresp.http.X-Cacheable = "YES";
    return (deliver);
}
#
sub vcl_deliver {
#    return (deliver);
   #add cache hit data
   if (obj.hits > 0) {
     #if hit add hit count
     set resp.http.X-Cache = "HIT";
     set resp.http.X-Cache-Hits = obj.hits;
   } else {
     set resp.http.X-Cache = "MISS";
   }
}

sub vcl_error {
    if (obj.status == 503 && req.restarts < 5) {
        set obj.http.X-Restarts = req.restarts;
        restart;
    }
}

I've also added this to the bottom of settings.php:

$conf['reverse_proxy'] = TRUE;
$conf['reverse_proxy_addresses'] = array('127.0.0.1');

I also have Drupal set to "Aggressive Caching" on the performance page.

Is there some little thing I'm missing or maybe a direction someone could point me towards on other things to try?

도움이 되었습니까?

해결책

Many modules will either start a session or add a cookie that will cause the page to not be cacheable. There are a number of possibilities and solutions found here:

https://wiki.fourkitchens.com/display/PF/Modules+that+break+caching,+and+how+to+fix+them

some tips on debugging which module is starting a session.

http://groups.drupal.org/node/66888

다른 팁

I would take a look at the lullabot article too:

Configuring Varnish for High-Availability with Multiple Web Servers

http://www.lullabot.com/articles/varnish-multiple-web-servers-drupal

They have a full varnish config for drupal to start from, as well as a proper varnish status check php script.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top