Server Fault is a question and answer site for system and network administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

My site uses nginx, varnish, jboss. And some url will be cached by varnish, it depends a response header from jboss.

The first time, jboss tells varnish doesn't cache this url. Then the second request, jboss tells varnish to cache, but varnish won't cache it. I used varnishstat and found that 1 object is cached in Varnish, is that the 'MISS status' object?

I remove grace code and the problem still exists. When I PURGE this url, varnish works fine and cache the url then. But I can't PURGE so much urls every startup time, how can I fix this?

The configuration:

acl local {
    "localhost";
}

backend default {
    .host = "localhost";
    .port = "8080";
    .probe = {
        .url = "/preload.htm";
        .interval = 3s;
        .timeout = 1s;
        .window = 5;
        .threshold = 3;
    }
}

sub vcl_deliver {
    if (req.request == "PURGE") {
        remove resp.http.X-Varnish;
        remove resp.http.Via;
        remove resp.http.Age;
        remove resp.http.Content-Type;
        remove resp.http.Server;
        remove resp.http.Date;
        remove resp.http.Accept-Ranges;
        remove resp.http.Connection;
        set resp.http.keeplive="true";
    } else {
        if (obj.hits > 0) {
            set resp.http.X-Cache = "HIT";
        } else {
            set resp.http.X-Cache = "MISS";
        }
    }
}

sub vcl_recv {
    if(req.url ~ "/check.htm"){
         error 404 "N";
    }
    if( req.http.host ~ "store." || req.request == "POST"){
        return (pipe);
    }
    if (req.backend.healthy) {
         set req.grace = 30s;
    } else {
         set req.grace = 10m;
    }

    set req.http.x-cacheKey = "0";
    if(req.url ~ "/shop/view_shop.htm" || req.url ~ "/shop/viewShop.htm" || req.url ~ "/index.htm"){
        if(req.url ~ "search=y"){
                set req.http.x-cacheKey = req.http.host + "/search.htm";
        }else if(req.url !~ "bbs=y" && req.url !~ "shopIntro=y" && req.url !~ "shop_intro=y"){
                set req.http.x-cacheKey = req.http.host + "/index.htm";
        }
    }else if(req.url ~ "/search"){
        set req.http.x-cacheKey = req.http.host + "/search.htm";
    }

    if( req.http.x-cacheKey == "0" && req.url !~ "/i/"){
        return (pipe);
    }

    if (req.request == "PURGE") {
        if (client.ip ~ local) {
            return (lookup);
        } else {
            error 405 "Not allowed.";
        }
    }

    if (req.url ~ "/i/") {
        set req.http.x-shop-url = req.original_url;
    }else {
        unset req.http.cookie;
    }
}

sub vcl_fetch {
    set beresp.grace = 10m;
    #unset beresp.http.x-cacheKey;
    if (req.url ~ "/i/" || req.url ~ "status" ){
        set beresp.ttl = 0s;      /* ttl=0 for dynamic content */
    } else if(beresp.http.x-varnish-cache != "1"){
        set beresp.do_esi = true; /* Do ESI processing */
        set beresp.ttl = 0s;
        unset beresp.http.set-cookie;
    } else {
        set beresp.do_esi = true; /* Do ESI processing */
        set beresp.ttl = 1800s;
        unset beresp.http.set-cookie;
    }
}

sub vcl_hash {
    hash_data(req.http.x-cacheKey);
    return (hash);
}

sub vcl_error {
    if (req.request == "PURGE") {
        return (deliver);
    } else {
        set obj.http.Content-Type = "text/html; charset=gbk";
        synthetic {"<!--ve-->"};
        return (deliver);
    }
}

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

sub vcl_miss {
    if (req.request == "PURGE") {
        error 404 "N";
    }
}
share|improve this question
    
What's your configuration look like? The output of varnishlog for this request would be good as well. Sounds like the behavior of hit_for_pass. – Shane Madden Oct 20 '12 at 18:51

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Browse other questions tagged or ask your own question.