-
Notifications
You must be signed in to change notification settings - Fork 86
/
vmod_xkey.vcc
136 lines (99 loc) · 4 KB
/
vmod_xkey.vcc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
$Module xkey 3 "Surrogate keys support for Varnish Cache"
DESCRIPTION
===========
PLEASE NOTE that this VMOD is currently in maintenance mode and has
known performance issues, particularly regarding scalability, which
will not be addressed in this implementation. For a more robust
solution with proven scalability, improved syntax support, and
proper softpurge functionality, consider using yKey, included in
Varnish Enterprise.
This vmod adds secondary hashes to objects, allowing fast purging on
all objects with this hash key.
You can use this to indicate relationships, a bit like a "tag". Then
clear out all object that have this tag set. Two good use cases are
news sites, where one might add all the stories mentioned on a
particular page by article ID, letting each article referenced create
an xkey header.
Similarly with an e-commerce site, where various SKUs are often
referenced on a page.
Hash keys are specified in the ``xkey`` response header. Multiple keys
can be specified per header line with spaces and/or commas as
separators. Alternatively, they can be specified in multiple ``xkey``
response headers.
Preferably the secondary hash keys are set from the backend
application, but the header can also be set from VCL in
``vcl_backend_response``.
.. vcl-start
VCL example::
vcl 4.0;
import xkey;
backend default { .host = "192.0.2.11"; .port = "8080"; }
acl purgers {
"203.0.113.0"/24;
}
sub vcl_recv {
if (req.method == "PURGE") {
if (client.ip !~ purgers) {
return (synth(403, "Forbidden"));
}
if (req.http.xkey) {
set req.http.n-gone = xkey.purge(req.http.xkey);
# or: set req.http.n-gone = xkey.softpurge(req.http.xkey)
return (synth(200, "Invalidated "+req.http.n-gone+" objects"));
} else {
return (purge);
}
}
}
.. vcl-end
Example
-------
On an e-commerce site we have the backend application issue an xkey
header for every product that is referenced on that page. So the
header for a certain page might look like this::
HTTP/1.1 OK
Server: Apache/2.2.15
xkey: 8155054
xkey: 166412
xkey: 234323
Alternatively you may instead use a single header with space separated
values like ``xkey: 8155054 166412 234323``.
This requires a bit of VCL to be in place. The VCL can be found above.
Then, in order to keep the web in sync with the database, a trigger is
set up in the database. When an SKU is updated this will trigger an
HTTP request towards the Varnish server, clearing out every object
with the matching xkey header::
PURGE / HTTP/1.1
Host: www.example.com
xkey: 166412
Several ``xkey-purge`` headers are also supported like in the response
example above, and you may also here use a single header with space
seperated values like ``xkey-purge: 166412 234323``.
Unlike `xkey` header for responses, purge header is fully configurable
by means of adjusting the name of the header in the VCL example above.
Note the xkey header. It is probably a good idea to protect
this with an ACL so random people from the Internet cannot purge your
cache.
Varnish will find the objects and clear them out, responding with::
HTTP/1.1 200 Purged
Date: Thu, 24 Apr 2014 17:08:28 GMT
X-Varnish: 1990228115
Via: 1.1 Varnish
The objects are now cleared.
$ABI strict
$Event event
$Function INT purge(STRING keys)
Description
Purges all objects hashed on any key found in the ``keys`` argument.
Returns the number of objects that were purged.
The ``keys`` may contain a list of space-separated ids.
$Function INT softpurge(STRING keys)
Description
Performs a "soft purge" for all objects hashed on any key found in the
``keys`` argument. Returns the number of objects that were purged.
A softpurge differs from a regular purge in that it resets an
object's TTL but keeps it available for grace mode and conditional
requests for the remainder of its configured grace and keep time.
Counters
--------
.. include:: VSC_xkey.rst