2
votes

I have a website www.mysite.com running behind a load balancer. There are two servers in the load balancer cluster. Each runs Varnish 3.0 and Apache/PHP (I know varnish could load balance for me - but we have a preference for a different LB tech).

Every now and again I need to purge an URL or two...

In my VCL I have 127.0.0.1 as a trusted URL for PURGEs. And a standard purge config:

vcl_recv:

....

    if (req.request == "PURGE") {

        # Allow requests from trusted IPs to purge the cache

        if (!client.ip ~ trusted) {

           error 405 "Not allowed.";

        }

        return(lookup); # @see vcl_hit;

    }

...

sub vcl_hit {

if (req.request == "PURGE") {

    purge;

    error 200 "Purged (via vcl_hit)";

}



if (!(obj.ttl > 0s)) {

    return (pass);

}



return (deliver);

}

sub vcl_miss {

if (req.request == "PURGE"){

    purge;

    error 404 "Not in Cache";

}

return (fetch);

}

Now from a shellscript I want to invalidate an URL.

curl -X PURGE http://127.0.0.1/product-47267.html

Doesnt work, but

curl -X PURGE http://www.mysite.com/product-47267.html

Does work. Problem here is - I need to invalidate on each local machine in cluster - not have the request go out and back in via the load balancer (because I dont know which machine will take the PURGE).

Hope this makes sense

LW

1

1 Answers

3
votes

You need to connect to localhost but Varnish still need to know which Host you want to PURGE.

I'm not sure but try something like the following :

curl -X PURGE -H "Host: www.mysite.com" http://127.0.0.1/product-47267.html