23
votes

I can't see a similar question, but apologies if I'm duping.

We're running a varnish cache on our system, but want to install a system where we can purge individual pages when they are edited (fairly normal). We've been trying to get it to work by using an HTTP header. So, our VCL is set up like:

acl purge {
      "localhost";
#### Our server IP #####
}

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

sub vcl_hit {
    if (req.request == "PURGE") {
            purge;
    }
 }

sub vcl_miss {
        if (req.request == "PURGE") {
                 purge;
        }
}

However, I'm stuck on how to actually SEND the http purge request. We're using PHP for the website, so I've tried using:

header("PL: PURGE / HTTP/1.0");
header("Host: url to purge");

But this doesn't seem to do anything (and varnishlog doesn't seem to show anything purging).

I've also experimented with cURL but, again, it doesn't seem to be working. Am I missing something really basic here, or is the basis sound, meaning my implementation is bugged?

Many thanks,

4

4 Answers

37
votes

You need to go and make an HTTP request.

Untested, but should be along the lines of (if you want to use curl as you mentioned):

$curl = curl_init("http://your.varnish.cache/url-to-purge");
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PURGE");
curl_exec($curl);
5
votes

Quick, dirty and effective way to send a PURGE request:

curl -v -k -X PURGE URL

You can actually make a little script with that statement, as follows:

1) Open an editor, in example VI

 vi varnish_purge_url.sh

2) Enter the following text:

#!/bin/sh

curl -v -k -X PURGE $1

(remember to leave the blank line between the first and last lines).

3) Save the file and exit. Then set the appropriate attributes to execute it from the shell:

chmod 750 varnish_purge_url.sh

4) You want to be root when creating and using the above script. If using Ubuntu, feel free to add sudo in front of commands when required.

5) Usage is simple:

./varnish_purge_url.sh URL

Where URL is the URL to purge.

4
votes

You can also purge using command line. Use the command sudo varnishadm. This will open the Varnish Command-line Interface. where you can type in your command to purge the pages as per your need. E.g to purge your home page, do this:

root@staging:/etc/varnish# sudo varnishadm
200        
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,3.5.0-28-generic,x86_64,-sfile,-smalloc,-hcritbit

Type 'help' for command list.
Type 'quit' to close CLI session.

varnish> ban.url ^/$
200  
0
votes

Maybe I'm on a newer version but what's above didn't work for me. This did:

sub vcl_hit {
  if (req.request == "PURGE") {
    ban("req.url ~ "+req.url);
    error 200 "Purged.";
  }
}