~ubuntu-branches/debian/sid/varnish/sid

« back to all changes in this revision

Viewing changes to man/vcl.7

  • Committer: Package Import Robot
  • Author(s): Stig Sandbeck Mathisen
  • Date: 2011-10-29 15:23:24 UTC
  • mfrom: (0.1.15)
  • Revision ID: package-import@ubuntu.com-20111029152324-tdtlsurrv22ysknj
Tags: 3.0.2-1
* New upstream release
* Build from upstream tarball instead of git tag
* debian/watch: more specific regular expression

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
.\" Man page generated from reStructeredText.
 
2
.
 
3
.TH VCL 7 "2010-06-02" "1.0" ""
 
4
.SH NAME
 
5
VCL \- Varnish Configuration Language
 
6
.
 
7
.nr rst2man-indent-level 0
 
8
.
 
9
.de1 rstReportMargin
 
10
\\$1 \\n[an-margin]
 
11
level \\n[rst2man-indent-level]
 
12
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 
13
-
 
14
\\n[rst2man-indent0]
 
15
\\n[rst2man-indent1]
 
16
\\n[rst2man-indent2]
 
17
..
 
18
.de1 INDENT
 
19
.\" .rstReportMargin pre:
 
20
. RS \\$1
 
21
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
 
22
. nr rst2man-indent-level +1
 
23
.\" .rstReportMargin post:
 
24
..
 
25
.de UNINDENT
 
26
. RE
 
27
.\" indent \\n[an-margin]
 
28
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
 
29
.nr rst2man-indent-level -1
 
30
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 
31
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 
32
..
 
33
.SH DESCRIPTION
 
34
.sp
 
35
The VCL language is a small domain\-specific language designed to be
 
36
used to define request handling and document caching policies for
 
37
Varnish Cache.
 
38
.sp
 
39
When a new configuration is loaded, the varnishd management process
 
40
translates the VCL code to C and compiles it to a shared object which
 
41
is then dynamically linked into the server process.
 
42
.SH SYNTAX
 
43
.sp
 
44
The VCL syntax is very simple, and deliberately similar to C and Perl.
 
45
Blocks are delimited by curly braces, statements end with semicolons,
 
46
and comments may be written as in C, C++ or Perl according to your own
 
47
preferences.
 
48
.sp
 
49
In addition to the C\-like assignment (=), comparison (==, !=) and
 
50
boolean (!, && and ||) operators, VCL supports both regular
 
51
expression and ACL matching using the ~ and the !~ operators.
 
52
.sp
 
53
Basic strings are enclosed in " ... ", and may not contain newlines.
 
54
.sp
 
55
Long strings are enclosed in {" ... "}. They may contain any
 
56
character including ", newline and other control characters except
 
57
for the NUL (0x00) character.
 
58
.sp
 
59
Unlike C and Perl, the backslash () character has no special meaning
 
60
in strings in VCL, so it can be freely used in regular expressions
 
61
without doubling.
 
62
.sp
 
63
Strings are concatenated using the \(aq+\(aq operator.
 
64
.sp
 
65
Assignments are introduced with the \fIset\fP keyword.  There are no
 
66
user\-defined variables; values can only be assigned to variables
 
67
attached to backend, request or document objects.  Most of these are
 
68
typed, and the values assigned to them must have a compatible unit
 
69
suffix.
 
70
.sp
 
71
You can use the \fIset\fP keyword to arbitrary HTTP headers. You can
 
72
remove headers with the \fIremove\fP or \fIunset\fP keywords, which are
 
73
synonym.
 
74
.sp
 
75
You can use the \fIrollback\fP keyword to revert any changes to req at
 
76
any time.
 
77
.sp
 
78
The \fIsynthetic\fP keyword is used to produce a synthetic response
 
79
body in vcl_error. It takes a single string as argument.
 
80
.sp
 
81
You can force a crash of the client process with the \fIpanic\fP keyword.
 
82
\fIpanic\fP takes a string as argument.
 
83
.sp
 
84
The \fBreturn(action)\fP keyword terminates the subroutine. \fIaction\fP can be,
 
85
depending on context one of
 
86
.INDENT 0.0
 
87
.IP \(bu 2
 
88
deliver
 
89
.IP \(bu 2
 
90
error
 
91
.IP \(bu 2
 
92
fetch
 
93
.IP \(bu 2
 
94
hash
 
95
.IP \(bu 2
 
96
hit_for_pass
 
97
.IP \(bu 2
 
98
lookup
 
99
.IP \(bu 2
 
100
ok
 
101
.IP \(bu 2
 
102
pass
 
103
.IP \(bu 2
 
104
pipe
 
105
.IP \(bu 2
 
106
restart
 
107
.UNINDENT
 
108
.sp
 
109
Please see the list of subroutines to see what return actions are
 
110
available where.
 
111
.sp
 
112
VCL has if tests, but no loops.
 
113
.sp
 
114
The contents of another VCL file may be inserted at any point in the
 
115
code by using the \fIinclude\fP keyword followed by the name of the other
 
116
file as a quoted string.
 
117
.SS Backend declarations
 
118
.sp
 
119
A backend declaration creates and initializes a named backend object::
 
120
.sp
 
121
.nf
 
122
.ft C
 
123
backend www {
 
124
  .host = "www.example.com";
 
125
  .port = "http";
 
126
}
 
127
.ft P
 
128
.fi
 
129
.sp
 
130
The backend object can later be used to select a backend at request time::
 
131
.sp
 
132
.nf
 
133
.ft C
 
134
if (req.http.host ~ "(?i)^(www.)?example.com$") {
 
135
  set req.backend = www;
 
136
}
 
137
.ft P
 
138
.fi
 
139
.sp
 
140
To avoid overloading backend servers, .max_connections can be set to
 
141
limit the maximum number of concurrent backend connections.
 
142
.sp
 
143
The timeout parameters can be overridden in the backend declaration.
 
144
The timeout parameters are .connect_timeout for the time to wait for a
 
145
backend connection, .first_byte_timeout for the time to wait for the
 
146
first byte from the backend and .between_bytes_timeout for time to
 
147
wait between each received byte.
 
148
.sp
 
149
These can be set in the declaration like this::
 
150
.sp
 
151
.nf
 
152
.ft C
 
153
backend www {
 
154
  .host = "www.example.com";
 
155
  .port = "http";
 
156
  .connect_timeout = 1s;
 
157
  .first_byte_timeout = 5s;
 
158
  .between_bytes_timeout = 2s;
 
159
}
 
160
.ft P
 
161
.fi
 
162
.sp
 
163
To mark a backend as unhealthy after number of items have been added
 
164
to its saintmode list \fB.saintmode_threshold\fP can be set to the maximum
 
165
list size. Setting a value of 0 disables saint mode checking entirely
 
166
for that backend.  The value in the backend declaration overrides the
 
167
parameter.
 
168
.SS Directors
 
169
.sp
 
170
A director is a logical group of backend servers clustered together
 
171
for redundancy. The basic role of the director is to let Varnish
 
172
choose a backend server amongst several so if one is down another can
 
173
be used.
 
174
.sp
 
175
There are several types of directors. The different director types
 
176
use different algorithms to choose which backend to use.
 
177
.sp
 
178
Configuring a director may look like this::
 
179
.sp
 
180
.nf
 
181
.ft C
 
182
director b2 random {
 
183
  .retries = 5;
 
184
  {
 
185
    // We can refer to named backends
 
186
    .backend = b1;
 
187
    .weight  = 7;
 
188
  }
 
189
  {
 
190
    // Or define them inline
 
191
    .backend  = {
 
192
      .host = "fs2";
 
193
    }
 
194
  .weight         = 3;
 
195
  }
 
196
}
 
197
.ft P
 
198
.fi
 
199
.SS The family of random directors
 
200
.sp
 
201
There are three directors that share the same logic, called the random
 
202
director, client director and hash director. They each distribute traffic
 
203
among the backends assigned to it using a random distribution seeded with
 
204
either the client identity, a random number or the cache hash (typically
 
205
url). Beyond the initial seed, they act the same.
 
206
.sp
 
207
Each backend requires a .weight option which sets the amount of traffic
 
208
each backend will get compared to the others. Equal weight means equal
 
209
traffic. A backend with lower weight than an other will get proportionally
 
210
less traffic.
 
211
.sp
 
212
The director has an optional .retries option which defaults to the number
 
213
of backends the director has. The director will attempt .retries times to
 
214
find a healthy backend if the first attempt fails. Each attempt re\-uses the
 
215
previous seed in an iterative manner. For the random director this detail
 
216
is of no importance as it will give different results each time. For the
 
217
hash and client director, this means the same URL or the same client will
 
218
fail to the same server consistently.
 
219
.SS The random director
 
220
.sp
 
221
This uses a random number to seed the backend selection.
 
222
.SS The client director
 
223
.sp
 
224
The client director picks a backend based on the clients
 
225
\fIidentity\fP. You can set the VCL variable \fIclient.identity\fP to identify
 
226
the client by picking up the value of a session cookie or similar.
 
227
.SS The hash director
 
228
.sp
 
229
The hash director will pick a backend based on the URL hash
 
230
value.
 
231
.sp
 
232
This is useful is you are using Varnish to load balance in front of
 
233
other Varnish caches or other web accelerators as objects won\(aqt be
 
234
duplicated across caches.
 
235
.sp
 
236
It will use the value of req.hash, just as the normal cache\-lookup methods.
 
237
.SS The round\-robin director
 
238
.sp
 
239
The round\-robin director does not take any options.
 
240
.sp
 
241
It will use the first backend for the first request, the second backend for
 
242
the second request and so on, and start from the top again when it gets to
 
243
the end.
 
244
.sp
 
245
If a backend is unhealthy or Varnish fails to connect, it will be skipped.
 
246
The round\-robin director will try all the backends once before giving up.
 
247
.SS The DNS director
 
248
.sp
 
249
The DNS director can use backends in two different ways. Either like the
 
250
random or round\-robin director or using .list:
 
251
.sp
 
252
.nf
 
253
.ft C
 
254
director directorname dns {
 
255
        .list = {
 
256
                .host_header = "www.example.com";
 
257
                .port = "80";
 
258
                .connect_timeout = 0.4s;
 
259
                "192.168.15.0"/24;
 
260
                "192.168.16.128"/25;
 
261
        }
 
262
        .ttl = 5m;
 
263
        .suffix = "internal.example.net";
 
264
}
 
265
.ft P
 
266
.fi
 
267
.sp
 
268
This will specify 384 backends, all using port 80 and a connection timeout
 
269
of 0.4s. Options must come before the list of IPs in the .list statement.
 
270
The .list\-method does not support IPv6. It is not a white\-list, it is an
 
271
actual list of backends that will be created internally in Varnish \- the
 
272
larger subnet the more overhead.
 
273
.sp
 
274
The .ttl defines the cache duration of the DNS lookups.
 
275
.sp
 
276
The above example will append "internal.example.net" to the incoming Host
 
277
header supplied by the client, before looking it up. All settings are
 
278
optional.
 
279
.sp
 
280
Health checks are not thoroughly supported.
 
281
.sp
 
282
DNS round robin balancing is supported. If a hostname resolves to multiple
 
283
backends, the director will divide the traffic between all of them in a
 
284
round\-robin manner.
 
285
.SS The fallback director
 
286
.sp
 
287
The fallback director will pick the first backend that is healthy. It
 
288
considers them in the order in which they are listed in its definition.
 
289
.sp
 
290
The fallback director does not take any options.
 
291
.sp
 
292
An example of a fallback director:
 
293
.sp
 
294
.nf
 
295
.ft C
 
296
director b3 fallback {
 
297
  { .backend = www1; }
 
298
  { .backend = www2; } // will only be used if www1 is unhealthy.
 
299
  { .backend = www3; } // will only be used if both www1 and www2
 
300
                       // are unhealthy.
 
301
}
 
302
.ft P
 
303
.fi
 
304
.SS Backend probes
 
305
.sp
 
306
Backends can be probed to see whether they should be considered
 
307
healthy or not.  The return status can also be checked by using
 
308
req.backend.healthy.
 
309
.sp
 
310
Probes take the following parameters:
 
311
.INDENT 0.0
 
312
.TP
 
313
.B .url
 
314
Specify a URL to request from the backend.
 
315
Defaults to "/".
 
316
.TP
 
317
.B .request
 
318
Specify a full HTTP request using multiple strings. .request will
 
319
have \er\en automatically inserted after every string.
 
320
If specified, .request will take precedence over .url.
 
321
.TP
 
322
.B .window
 
323
How many of the latest polls we examine to determine backend health.
 
324
Defaults to 8.
 
325
.TP
 
326
.B .threshold
 
327
How many of the polls in .window must have succeeded for us to consider
 
328
the backend healthy.
 
329
Defaults to 3.
 
330
.TP
 
331
.B .initial
 
332
How many of the probes are considered good when Varnish starts.
 
333
Defaults to the same amount as the threshold.
 
334
.TP
 
335
.B .expected_response
 
336
The expected backend HTTP response code.
 
337
Defaults to 200.
 
338
.TP
 
339
.B .interval
 
340
Defines how often the probe should check the backend.
 
341
Default is every 5 seconds.
 
342
.TP
 
343
.B .timeout
 
344
How fast each probe times out.
 
345
Default is 2 seconds.
 
346
.UNINDENT
 
347
.sp
 
348
A backend with a probe can be defined like this, together with the
 
349
backend or director::
 
350
.sp
 
351
.nf
 
352
.ft C
 
353
backend www {
 
354
  .host = "www.example.com";
 
355
  .port = "http";
 
356
  .probe = {
 
357
    .url = "/test.jpg";
 
358
    .timeout = 0.3 s;
 
359
    .window = 8;
 
360
    .threshold = 3;
 
361
    .initial = 3;
 
362
  }
 
363
}
 
364
.ft P
 
365
.fi
 
366
.sp
 
367
Or it can be defined separately and then referenced::
 
368
.sp
 
369
.nf
 
370
.ft C
 
371
probe healthcheck {
 
372
   .url = "/status.cgi";
 
373
   .interval = 60s;
 
374
   .timeout = 0.3 s;
 
375
   .window = 8;
 
376
   .threshold = 3;
 
377
   .initial = 3;
 
378
   .expected_response = 200;
 
379
}
 
380
 
 
381
backend www {
 
382
  .host = "www.example.com";
 
383
  .port = "http";
 
384
  .probe = healthcheck;
 
385
}
 
386
.ft P
 
387
.fi
 
388
.sp
 
389
If you have many backends this can simplify the config a lot.
 
390
.sp
 
391
It is also possible to specify the raw HTTP request:
 
392
.sp
 
393
.nf
 
394
.ft C
 
395
probe rawprobe {
 
396
    # NB: \er\en automatically inserted after each string!
 
397
    .request =
 
398
      "GET / HTTP/1.1"
 
399
      "Host: www.foo.bar"
 
400
      "Connection: close";
 
401
}
 
402
.ft P
 
403
.fi
 
404
.SS ACLs
 
405
.sp
 
406
An ACL declaration creates and initializes a named access control list
 
407
which can later be used to match client addresses::
 
408
.sp
 
409
.nf
 
410
.ft C
 
411
acl local {
 
412
  "localhost";         // myself
 
413
  "192.0.2.0"/24;      // and everyone on the local network
 
414
  ! "192.0.2.23";      // except for the dialin router
 
415
}
 
416
.ft P
 
417
.fi
 
418
.sp
 
419
If an ACL entry specifies a host name which Varnish is unable to
 
420
resolve, it will match any address it is com‐ pared to.  Consequently,
 
421
if it is preceded by a negation mark, it will reject any address it is
 
422
compared to, which may not be what you intended.  If the entry is
 
423
enclosed in parentheses, however, it will simply be ignored.
 
424
.sp
 
425
To match an IP address against an ACL, simply use the match operator::
 
426
.sp
 
427
.nf
 
428
.ft C
 
429
if (client.ip ~ local) {
 
430
  return (pipe);
 
431
}
 
432
.ft P
 
433
.fi
 
434
.SS Regular Expressions
 
435
.sp
 
436
In Varnish 2.1.0 Varnish switched to using PCRE \- Perl\-compatible
 
437
regular expressions. For a complete description of PCRE please see the
 
438
PCRE(3) man page.
 
439
.sp
 
440
To send flags to the PCRE engine, such as to turn on \fIcase
 
441
insensitivity\fP add the flag within parens following a question mark,
 
442
like this::
 
443
.sp
 
444
.nf
 
445
.ft C
 
446
if (req.http.host ~ "(?i)example.com$") {
 
447
        ...
 
448
}
 
449
.ft P
 
450
.fi
 
451
.SS Functions
 
452
.sp
 
453
The following built\-in functions are available:
 
454
.INDENT 0.0
 
455
.TP
 
456
.B hash_data(str)
 
457
Adds a string to the hash input. In default.vcl hash_data() is
 
458
called on the host and URL of the \fIrequest\fP.
 
459
.TP
 
460
.B regsub(str, regex, sub)
 
461
Returns a copy of str with the first occurrence of the regular
 
462
expression regex replaced with sub. Within sub, 0 (which can
 
463
also be spelled &) is replaced with the entire matched string,
 
464
and n is replaced with the contents of subgroup n in the
 
465
matched string.
 
466
.TP
 
467
.B regsuball(str, regex, sub)
 
468
As regsuball() but this replaces all occurrences.
 
469
.UNINDENT
 
470
.sp
 
471
ban(ban expression)
 
472
.INDENT 0.0
 
473
.TP
 
474
.B ban_url(regex)
 
475
Bans all objects in cache whose URLs match regex.
 
476
.UNINDENT
 
477
.SS Subroutines
 
478
.sp
 
479
A subroutine is used to group code for legibility or reusability::
 
480
.sp
 
481
.nf
 
482
.ft C
 
483
sub pipe_if_local {
 
484
  if (client.ip ~ local) {
 
485
    return (pipe);
 
486
  }
 
487
}
 
488
.ft P
 
489
.fi
 
490
.sp
 
491
Subroutines in VCL do not take arguments, nor do they return values.
 
492
.sp
 
493
To call a subroutine, use the call keyword followed by the subroutine\(aqs name:
 
494
.sp
 
495
call pipe_if_local;
 
496
.sp
 
497
There are a number of special subroutines which hook into the Varnish
 
498
workflow.  These subroutines may inspect and manipulate HTTP headers
 
499
and various other aspects of each request, and to a certain extent
 
500
decide how the request should be handled.  Each subroutine terminates
 
501
by calling one of a small number of keywords which indicates the
 
502
desired outcome.
 
503
.INDENT 0.0
 
504
.TP
 
505
.B vcl_init
 
506
Called when VCL is loaded, before any requests pass through it.
 
507
Typically used to initialize VMODs.
 
508
.sp
 
509
return() values:
 
510
.INDENT 7.0
 
511
.TP
 
512
.B ok
 
513
Normal return, VCL continues loading.
 
514
.UNINDENT
 
515
.TP
 
516
.B vcl_recv
 
517
Called at the beginning of a request, after the complete request has
 
518
been received and parsed.  Its purpose is to decide whether or not
 
519
to serve the request, how to do it, and, if applicable, which backend
 
520
to use.
 
521
.sp
 
522
The vcl_recv subroutine may terminate with calling return() on one of
 
523
the following keywords:
 
524
.INDENT 7.0
 
525
.TP
 
526
.B error code [reason]
 
527
Return the specified error code to the client and abandon the request.
 
528
.TP
 
529
.B pass
 
530
Switch to pass mode.  Control will eventually pass to vcl_pass.
 
531
.TP
 
532
.B pipe
 
533
Switch to pipe mode.  Control will eventually pass to vcl_pipe.
 
534
.TP
 
535
.B lookup
 
536
Look up the requested object in the cache.  Control will
 
537
eventually pass to vcl_hit or vcl_miss, depending on whether the
 
538
object is in the cache.
 
539
.UNINDENT
 
540
.TP
 
541
.B vcl_pipe
 
542
Called upon entering pipe mode.  In this mode, the request is passed
 
543
on to the backend, and any further data from either client or
 
544
backend is passed on unaltered until either end closes the
 
545
connection.
 
546
.sp
 
547
The vcl_pipe subroutine may terminate with calling return() with one of
 
548
the following keywords:
 
549
.INDENT 7.0
 
550
.TP
 
551
.B error code [reason]
 
552
Return the specified error code to the client and abandon the request.
 
553
.TP
 
554
.B pipe
 
555
Proceed with pipe mode.
 
556
.UNINDENT
 
557
.TP
 
558
.B vcl_pass
 
559
Called upon entering pass mode.  In this mode, the request is passed
 
560
on to the backend, and the backend\(aqs response is passed on to the
 
561
client, but is not entered into the cache.  Subsequent requests sub‐
 
562
mitted over the same client connection are handled normally.
 
563
.sp
 
564
The vcl_recv subroutine may terminate with calling return() with one of
 
565
the following keywords:
 
566
.INDENT 7.0
 
567
.TP
 
568
.B error code [reason]
 
569
Return the specified error code to the client and abandon the request.
 
570
.TP
 
571
.B pass
 
572
Proceed with pass mode.
 
573
.TP
 
574
.B restart
 
575
Restart the transaction. Increases the restart counter. If the number
 
576
of restarts is higher than \fImax_restarts\fP varnish emits a guru meditation
 
577
error.
 
578
.UNINDENT
 
579
.TP
 
580
.B vcl_hash
 
581
You may call hash_data() on the data you would like to add to the hash.
 
582
.sp
 
583
The vcl_hash subroutine may terminate with calling return() with one of
 
584
the following keywords:
 
585
.INDENT 7.0
 
586
.TP
 
587
.B hash
 
588
Proceed.
 
589
.UNINDENT
 
590
.TP
 
591
.B vcl_hit
 
592
Called after a cache lookup if the requested document was found in the cache.
 
593
.sp
 
594
The vcl_hit subroutine may terminate with calling return() with one of
 
595
the following keywords:
 
596
.INDENT 7.0
 
597
.TP
 
598
.B deliver
 
599
Deliver the cached object to the client.  Control will eventually
 
600
pass to vcl_deliver.
 
601
.TP
 
602
.B error code [reason]
 
603
Return the specified error code to the client and abandon the request.
 
604
.TP
 
605
.B pass
 
606
Switch to pass mode.  Control will eventually pass to vcl_pass.
 
607
.TP
 
608
.B restart
 
609
Restart the transaction. Increases the restart counter. If the number
 
610
of restarts is higher than \fImax_restarts\fP varnish emits a guru meditation
 
611
error.
 
612
.UNINDENT
 
613
.TP
 
614
.B vcl_miss
 
615
Called after a cache lookup if the requested document was not found
 
616
in the cache.  Its purpose is to decide whether or not to attempt to
 
617
retrieve the document from the backend, and which backend to use.
 
618
.sp
 
619
The vcl_miss subroutine may terminate with calling return() with one of
 
620
the following keywords:
 
621
.INDENT 7.0
 
622
.TP
 
623
.B error code [reason]
 
624
Return the specified error code to the client and abandon the request.
 
625
.TP
 
626
.B pass
 
627
Switch to pass mode.  Control will eventually pass to vcl_pass.
 
628
.TP
 
629
.B fetch
 
630
Retrieve the requested object from the backend.  Control will
 
631
eventually pass to vcl_fetch.
 
632
.UNINDENT
 
633
.TP
 
634
.B vcl_fetch
 
635
Called after a document has been successfully retrieved from the backend.
 
636
.sp
 
637
The vcl_fetch subroutine may terminate with calling return() with
 
638
one of the following keywords:
 
639
.INDENT 7.0
 
640
.TP
 
641
.B deliver
 
642
Possibly insert the object into the cache, then deliver it to the
 
643
client.  Control will eventually pass to vcl_deliver.
 
644
.TP
 
645
.B error code [reason]
 
646
Return the specified error code to the client and abandon the request.
 
647
.TP
 
648
.B hit_for_pass
 
649
Pass in fetch. This will create a hit_for_pass object. Note that
 
650
the TTL for the hit_for_pass object will be set to what the
 
651
current value of beresp.ttl. Control will be handled to
 
652
vcl_deliver on the current request, but subsequent requests will
 
653
go directly to vcl_pass based on the hit_for_pass object.
 
654
.TP
 
655
.B restart
 
656
Restart the transaction. Increases the restart counter. If the number
 
657
of restarts is higher than \fImax_restarts\fP varnish emits a guru meditation
 
658
error.
 
659
.UNINDENT
 
660
.TP
 
661
.B vcl_deliver
 
662
Called before a cached object is delivered to the client.
 
663
.sp
 
664
The vcl_deliver subroutine may terminate with one of the following
 
665
keywords:
 
666
.INDENT 7.0
 
667
.TP
 
668
.B deliver
 
669
Deliver the object to the client.
 
670
.TP
 
671
.B error code [reason]
 
672
Return the specified error code to the client and abandon the request.
 
673
.TP
 
674
.B restart
 
675
Restart the transaction. Increases the restart counter. If the number
 
676
of restarts is higher than \fImax_restarts\fP varnish emits a guru meditation
 
677
error.
 
678
.UNINDENT
 
679
.TP
 
680
.B vcl_error
 
681
Called when we hit an error, either explicitly or implicitly due to
 
682
backend or internal errors.
 
683
.sp
 
684
The vcl_error subroutine may terminate by calling return with one of
 
685
the following keywords:
 
686
.INDENT 7.0
 
687
.TP
 
688
.B deliver
 
689
Deliver the error object to the client.
 
690
.TP
 
691
.B restart
 
692
Restart the transaction. Increases the restart counter. If the number
 
693
of restarts is higher than \fImax_restarts\fP varnish emits a guru meditation
 
694
error.
 
695
.UNINDENT
 
696
.TP
 
697
.B vcl_fini
 
698
Called when VCL is discarded only after all requests have exited the VCL.
 
699
Typically used to clean up VMODs.
 
700
.sp
 
701
return() values:
 
702
.INDENT 7.0
 
703
.TP
 
704
.B ok
 
705
Normal return, VCL will be discarded.
 
706
.UNINDENT
 
707
.UNINDENT
 
708
.sp
 
709
If one of these subroutines is left undefined or terminates without
 
710
reaching a handling decision, control will be handed over to the
 
711
builtin default.  See the EXAMPLES section for a listing of the
 
712
default code.
 
713
.SS Multiple subroutines
 
714
.sp
 
715
If multiple subroutines with the same name are defined, they are
 
716
concatenated in the order in which the appear in the source.
 
717
.sp
 
718
Example::
 
719
.sp
 
720
.nf
 
721
.ft C
 
722
# in file "main.vcl"
 
723
include "backends.vcl";
 
724
include "ban.vcl";
 
725
 
 
726
# in file "backends.vcl"
 
727
sub vcl_recv {
 
728
  if (req.http.host ~ "(?i)example.com") {
 
729
    set req.backend = foo;
 
730
  } elsif (req.http.host ~ "(?i)example.org") {
 
731
    set req.backend = bar;
 
732
  }
 
733
}
 
734
 
 
735
# in file "ban.vcl"
 
736
sub vcl_recv {
 
737
  if (client.ip ~ admin_network) {
 
738
    if (req.http.Cache\-Control ~ "no\-cache") {
 
739
      ban_url(req.url);
 
740
    }
 
741
  }
 
742
}
 
743
.ft P
 
744
.fi
 
745
.sp
 
746
The builtin default subroutines are implicitly appended in this way.
 
747
.SS Variables
 
748
.sp
 
749
Although subroutines take no arguments, the necessary information is
 
750
made available to the handler subroutines through global variables.
 
751
.sp
 
752
The following variables are always available:
 
753
.INDENT 0.0
 
754
.TP
 
755
.B now
 
756
The current time, in seconds since the epoch.
 
757
.UNINDENT
 
758
.sp
 
759
The following variables are available in backend declarations:
 
760
.INDENT 0.0
 
761
.TP
 
762
.B .host
 
763
Host name or IP address of a backend.
 
764
.TP
 
765
.B .port
 
766
Service name or port number of a backend.
 
767
.UNINDENT
 
768
.sp
 
769
The following variables are available while processing a request:
 
770
.INDENT 0.0
 
771
.TP
 
772
.B client.ip
 
773
The client\(aqs IP address.
 
774
.TP
 
775
.B client.identity
 
776
Identification of the client, used to load balance in the client director.
 
777
.TP
 
778
.B server.hostname
 
779
The host name of the server.
 
780
.TP
 
781
.B server.identity
 
782
The identity of the server, as set by the \-i
 
783
parameter.  If the \-i parameter is not passed to varnishd,
 
784
server.identity will be set to the name of the instance, as
 
785
specified by the \-n parameter.
 
786
.TP
 
787
.B server.ip
 
788
The IP address of the socket on which the client connection was received.
 
789
.TP
 
790
.B server.port
 
791
The port number of the socket on which the client connection was received.
 
792
.TP
 
793
.B req.request
 
794
The request type (e.g. "GET", "HEAD").
 
795
.TP
 
796
.B req.url
 
797
The requested URL.
 
798
.TP
 
799
.B req.proto
 
800
The HTTP protocol version used by the client.
 
801
.TP
 
802
.B req.backend
 
803
The backend to use to service the request.
 
804
.TP
 
805
.B req.backend.healthy
 
806
Whether the backend is healthy or not. Requires an active probe to be set
 
807
on the backend.
 
808
.TP
 
809
.B req.http.header
 
810
The corresponding HTTP header.
 
811
.TP
 
812
.B req.hash_always_miss
 
813
Force a cache miss for this request. If set to true Varnish will disregard
 
814
any existing objects and always (re)fetch from the backend.
 
815
.TP
 
816
.B req.hash_ignore_busy
 
817
Ignore any busy object during cache lookup. You would want to do
 
818
this if you have two server looking up content from each other to
 
819
avoid potential deadlocks.
 
820
.TP
 
821
.B req.can_gzip
 
822
Does the client accept the gzip transfer encoding.
 
823
.TP
 
824
.B req.restarts
 
825
A count of how many times this request has been restarted.
 
826
.TP
 
827
.B req.esi
 
828
Boolean. Set to false to disable ESI processing regardless of any
 
829
value in beresp.do_esi. Defaults to true. This variable is subject
 
830
to change in future versions, you should avoid using it.
 
831
.TP
 
832
.B req.esi_level
 
833
A count of how many levels of ESI requests we\(aqre currently at.
 
834
.TP
 
835
.B req.grace
 
836
Set to a period to enable grace.
 
837
.TP
 
838
.B req.xid
 
839
Unique ID of this request.
 
840
.UNINDENT
 
841
.sp
 
842
The following variables are available while preparing a backend
 
843
request (either for a cache miss or for pass or pipe mode):
 
844
.INDENT 0.0
 
845
.TP
 
846
.B bereq.request
 
847
The request type (e.g. "GET", "HEAD").
 
848
.TP
 
849
.B bereq.url
 
850
The requested URL.
 
851
.TP
 
852
.B bereq.proto
 
853
The HTTP protocol version used to talk to the server.
 
854
.TP
 
855
.B bereq.http.header
 
856
The corresponding HTTP header.
 
857
.TP
 
858
.B bereq.connect_timeout
 
859
The time in seconds to wait for a backend connection.
 
860
.TP
 
861
.B bereq.first_byte_timeout
 
862
The time in seconds to wait for the first byte from the backend.  Not
 
863
available in pipe mode.
 
864
.TP
 
865
.B bereq.between_bytes_timeout
 
866
The time in seconds to wait between each received byte from the
 
867
backend.  Not available in pipe mode.
 
868
.UNINDENT
 
869
.sp
 
870
The following variables are available after the requested object has
 
871
been retrieved from the backend, before it is entered into the cache. In
 
872
other words, they are available in vcl_fetch:
 
873
.INDENT 0.0
 
874
.TP
 
875
.B beresp.do_stream
 
876
Deliver the object to the client directly without fetching the whole
 
877
object into varnish. If this request is pass\(aqed it will not be
 
878
stored in memory. As of Varnish Cache 3.0 the object will marked as busy
 
879
as it is delivered so only client can access the object.
 
880
.TP
 
881
.B beresp.do_esi
 
882
Boolean. ESI\-process the object after fetching it. Defaults to
 
883
false. Set it to true to parse the object for ESI directives. Will
 
884
only be honored if req.esi is true.
 
885
.TP
 
886
.B beresp.do_gzip
 
887
Boolean. Gzip the object before storing it. Defaults to false.
 
888
.TP
 
889
.B beresp.do_gunzip
 
890
Boolean. Unzip the object before storing it in the cache.  Defaults
 
891
to false.
 
892
.TP
 
893
.B beresp.proto
 
894
The HTTP protocol version used the backend replied with.
 
895
.TP
 
896
.B beresp.status
 
897
The HTTP status code returned by the server.
 
898
.TP
 
899
.B beresp.response
 
900
The HTTP status message returned by the server.
 
901
.TP
 
902
.B beresp.ttl
 
903
The object\(aqs remaining time to live, in seconds. beresp.ttl is writable.
 
904
.TP
 
905
.B beresp.grace
 
906
Set to a period to enable grace.
 
907
.TP
 
908
.B beresp.saintmode
 
909
Set to a period to enable saint mode.
 
910
.TP
 
911
.B beresp.backend.name
 
912
Name of the backend this response was fetched from.
 
913
.TP
 
914
.B beresp.backend.ip
 
915
IP of the backend this response was fetched from.
 
916
.TP
 
917
.B beresp.backend.port
 
918
Port of the backend this response was fetched from.
 
919
.TP
 
920
.B beresp.storage
 
921
Set to force Varnish to save this object to a particular storage
 
922
backend.
 
923
.UNINDENT
 
924
.sp
 
925
After the object is entered into the cache, the following (mostly
 
926
read\-only) variables are available when the object has been located in
 
927
cache, typically in vcl_hit and vcl_deliver.
 
928
.INDENT 0.0
 
929
.TP
 
930
.B obj.proto
 
931
The HTTP protocol version used when the object was retrieved.
 
932
.TP
 
933
.B obj.status
 
934
The HTTP status code returned by the server.
 
935
.TP
 
936
.B obj.response
 
937
The HTTP status message returned by the server.
 
938
.TP
 
939
.B obj.ttl
 
940
The object\(aqs remaining time to live, in seconds. obj.ttl is writable.
 
941
.TP
 
942
.B obj.lastuse
 
943
The approximate time elapsed since the object was last requests, in
 
944
seconds.
 
945
.TP
 
946
.B obj.hits
 
947
The approximate number of times the object has been delivered. A value
 
948
of 0 indicates a cache miss.
 
949
.TP
 
950
.B obj.grace
 
951
The object\(aqs grace period in seconds. obj.grace is writable.
 
952
.TP
 
953
.B obj.http.header
 
954
The corresponding HTTP header.
 
955
.UNINDENT
 
956
.sp
 
957
The following variables are available while determining the hash key
 
958
of an object:
 
959
.INDENT 0.0
 
960
.TP
 
961
.B req.hash
 
962
The hash key used to refer to an object in the cache.  Used when
 
963
both reading from and writing to the cache.
 
964
.UNINDENT
 
965
.sp
 
966
The following variables are available while preparing a response to the client:
 
967
.INDENT 0.0
 
968
.TP
 
969
.B resp.proto
 
970
The HTTP protocol version to use for the response.
 
971
.TP
 
972
.B resp.status
 
973
The HTTP status code that will be returned.
 
974
.TP
 
975
.B resp.response
 
976
The HTTP status message that will be returned.
 
977
.TP
 
978
.B resp.http.header
 
979
The corresponding HTTP header.
 
980
.UNINDENT
 
981
.sp
 
982
Values may be assigned to variables using the set keyword::
 
983
.sp
 
984
.nf
 
985
.ft C
 
986
sub vcl_recv {
 
987
  # Normalize the Host: header
 
988
  if (req.http.host ~ "(?i)^(www.)?example.com$") {
 
989
    set req.http.host = "www.example.com";
 
990
  }
 
991
}
 
992
.ft P
 
993
.fi
 
994
.sp
 
995
HTTP headers can be removed entirely using the remove keyword::
 
996
.sp
 
997
.nf
 
998
.ft C
 
999
sub vcl_fetch {
 
1000
  # Don\(aqt cache cookies
 
1001
  remove beresp.http.Set\-Cookie;
 
1002
}
 
1003
.ft P
 
1004
.fi
 
1005
.SS Grace and saint mode
 
1006
.sp
 
1007
If the backend takes a long time to generate an object there is a risk
 
1008
of a thread pile up.  In order to prevent this you can enable \fIgrace\fP.
 
1009
This allows varnish to serve an expired version of the object while a
 
1010
fresh object is being generated by the backend.
 
1011
.sp
 
1012
The following vcl code will make Varnish serve expired objects.  All
 
1013
object will be kept up to two minutes past their expiration time or a
 
1014
fresh object is generated.:
 
1015
.sp
 
1016
.nf
 
1017
.ft C
 
1018
sub vcl_recv {
 
1019
  set req.grace = 2m;
 
1020
}
 
1021
sub vcl_fetch {
 
1022
  set beresp.grace = 2m;
 
1023
}
 
1024
.ft P
 
1025
.fi
 
1026
.sp
 
1027
Saint mode is similar to grace mode and relies on the same
 
1028
infrastructure but functions differently. You can add VCL code to
 
1029
vcl_fetch to see whether or not you \fIlike\fP the response coming from
 
1030
the backend. If you find that the response is not appropriate you can
 
1031
set beresp.saintmode to a time limit and call \fIrestart\fP. Varnish will
 
1032
then retry other backends to try to fetch the object again.
 
1033
.sp
 
1034
If there are no more backends or if you hit \fImax_restarts\fP and we have
 
1035
an object that is younger than what you set beresp.saintmode to be
 
1036
Varnish will serve the object, even if it is stale.
 
1037
.SH EXAMPLES
 
1038
.sp
 
1039
The following code is the equivalent of the default configuration with
 
1040
the backend address set to "backend.example.com" and no backend port
 
1041
specified::
 
1042
.sp
 
1043
.nf
 
1044
.ft C
 
1045
backend default {
 
1046
 .host = "backend.example.com";
 
1047
 .port = "http";
 
1048
}
 
1049
.ft P
 
1050
.fi
 
1051
.sp
 
1052
.nf
 
1053
.ft C
 
1054
/*\-
 
1055
 * Copyright (c) 2006 Verdens Gang AS
 
1056
 * Copyright (c) 2006\-2011 Varnish Software AS
 
1057
 * All rights reserved.
 
1058
 *
 
1059
 * Author: Poul\-Henning Kamp <phk@phk.freebsd.dk>
 
1060
 *
 
1061
 * Redistribution and use in source and binary forms, with or without
 
1062
 * modification, are permitted provided that the following conditions
 
1063
 * are met:
 
1064
 * 1. Redistributions of source code must retain the above copyright
 
1065
 *    notice, this list of conditions and the following disclaimer.
 
1066
 * 2. Redistributions in binary form must reproduce the above copyright
 
1067
 *    notice, this list of conditions and the following disclaimer in the
 
1068
 *    documentation and/or other materials provided with the distribution.
 
1069
 *
 
1070
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS \(ga\(gaAS IS\(aq\(aq AND
 
1071
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 
1072
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 
1073
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE
 
1074
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 
1075
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 
1076
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 
 
1077
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 
1078
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 
1079
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 
1080
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
1081
 *
 
1082
 * The default VCL code.
 
1083
 *
 
1084
 * NB! You do NOT need to copy & paste all of these functions into your
 
1085
 * own vcl code, if you do not provide a definition of one of these
 
1086
 * functions, the compiler will automatically fall back to the default
 
1087
 * code from this file.
 
1088
 *
 
1089
 * This code will be prefixed with a backend declaration built from the
 
1090
 * \-b argument.
 
1091
 */
 
1092
 
 
1093
sub vcl_recv {
 
1094
    if (req.restarts == 0) {
 
1095
        if (req.http.x\-forwarded\-for) {
 
1096
            set req.http.X\-Forwarded\-For =
 
1097
                req.http.X\-Forwarded\-For + ", " + client.ip;
 
1098
        } else {
 
1099
            set req.http.X\-Forwarded\-For = client.ip;
 
1100
        }
 
1101
    }
 
1102
    if (req.request != "GET" &&
 
1103
      req.request != "HEAD" &&
 
1104
      req.request != "PUT" &&
 
1105
      req.request != "POST" &&
 
1106
      req.request != "TRACE" &&
 
1107
      req.request != "OPTIONS" &&
 
1108
      req.request != "DELETE") {
 
1109
        /* Non\-RFC2616 or CONNECT which is weird. */
 
1110
        return (pipe);
 
1111
    }
 
1112
    if (req.request != "GET" && req.request != "HEAD") {
 
1113
        /* We only deal with GET and HEAD by default */
 
1114
        return (pass);
 
1115
    }
 
1116
    if (req.http.Authorization || req.http.Cookie) {
 
1117
        /* Not cacheable by default */
 
1118
        return (pass);
 
1119
    }
 
1120
    return (lookup);
 
1121
}
 
1122
 
 
1123
sub vcl_pipe {
 
1124
    # Note that only the first request to the backend will have
 
1125
    # X\-Forwarded\-For set.  If you use X\-Forwarded\-For and want to
 
1126
    # have it set for all requests, make sure to have:
 
1127
    # set bereq.http.connection = "close";
 
1128
    # here.  It is not set by default as it might break some broken web
 
1129
    # applications, like IIS with NTLM authentication.
 
1130
    return (pipe);
 
1131
}
 
1132
 
 
1133
sub vcl_pass {
 
1134
    return (pass);
 
1135
}
 
1136
 
 
1137
sub vcl_hash {
 
1138
    hash_data(req.url);
 
1139
    if (req.http.host) {
 
1140
        hash_data(req.http.host);
 
1141
    } else {
 
1142
        hash_data(server.ip);
 
1143
    }
 
1144
    return (hash);
 
1145
}
 
1146
 
 
1147
sub vcl_hit {
 
1148
    return (deliver);
 
1149
}
 
1150
 
 
1151
sub vcl_miss {
 
1152
    return (fetch);
 
1153
}
 
1154
 
 
1155
sub vcl_fetch {
 
1156
    if (beresp.ttl <= 0s ||
 
1157
        beresp.http.Set\-Cookie ||
 
1158
        beresp.http.Vary == "*") {
 
1159
                /*
 
1160
                 * Mark as "Hit\-For\-Pass" for the next 2 minutes
 
1161
                 */
 
1162
                set beresp.ttl = 120 s;
 
1163
                return (hit_for_pass);
 
1164
    }
 
1165
    return (deliver);
 
1166
}
 
1167
 
 
1168
sub vcl_deliver {
 
1169
    return (deliver);
 
1170
}
 
1171
 
 
1172
sub vcl_error {
 
1173
    set obj.http.Content\-Type = "text/html; charset=utf\-8";
 
1174
    set obj.http.Retry\-After = "5";
 
1175
    synthetic {"
 
1176
<?xml version="1.0" encoding="utf\-8"?>
 
1177
<!DOCTYPE html PUBLIC "\-//W3C//DTD XHTML 1.0 Strict//EN"
 
1178
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1\-strict.dtd">
 
1179
<html>
 
1180
  <head>
 
1181
    <title>"} + obj.status + " " + obj.response + {"</title>
 
1182
  </head>
 
1183
  <body>
 
1184
    <h1>Error "} + obj.status + " " + obj.response + {"</h1>
 
1185
    <p>"} + obj.response + {"</p>
 
1186
    <h3>Guru Meditation:</h3>
 
1187
    <p>XID: "} + req.xid + {"</p>
 
1188
    <hr>
 
1189
    <p>Varnish cache server</p>
 
1190
  </body>
 
1191
</html>
 
1192
"};
 
1193
    return (deliver);
 
1194
}
 
1195
 
 
1196
sub vcl_init {
 
1197
        return (ok);
 
1198
}
 
1199
 
 
1200
sub vcl_fini {
 
1201
        return (ok);
 
1202
}
 
1203
 
 
1204
.ft P
 
1205
.fi
 
1206
.sp
 
1207
The following example shows how to support multiple sites running on
 
1208
separate backends in the same Varnish instance, by selecting backends
 
1209
based on the request URL::
 
1210
.sp
 
1211
.nf
 
1212
.ft C
 
1213
backend www {
 
1214
  .host = "www.example.com";
 
1215
  .port = "80";
 
1216
}
 
1217
 
 
1218
backend images {
 
1219
  .host = "images.example.com";
 
1220
  .port = "80";
 
1221
}
 
1222
 
 
1223
sub vcl_recv {
 
1224
  if (req.http.host ~ "(?i)^(www.)?example.com$") {
 
1225
    set req.http.host = "www.example.com";
 
1226
    set req.backend = www;
 
1227
  } elsif (req.http.host ~ "(?i)^images.example.com$") {
 
1228
    set req.backend = images;
 
1229
  } else {
 
1230
    error 404 "Unknown virtual host";
 
1231
  }
 
1232
}
 
1233
 
 
1234
The following snippet demonstrates how to force a minimum TTL for
 
1235
all documents.  Note that this is not the same as setting the
 
1236
default_ttl run\-time parameter, as that only affects document for
 
1237
which the backend did not specify a TTL:::
 
1238
 
 
1239
import std; # needed for std.log
 
1240
 
 
1241
sub vcl_fetch {
 
1242
  if (beresp.ttl < 120s) {
 
1243
    std.log("Adjusting TTL");
 
1244
    set beresp.ttl = 120s;
 
1245
  }
 
1246
}
 
1247
.ft P
 
1248
.fi
 
1249
.sp
 
1250
The following snippet demonstrates how to force Varnish to cache
 
1251
documents even when cookies are present::
 
1252
.sp
 
1253
.nf
 
1254
.ft C
 
1255
sub vcl_recv {
 
1256
  if (req.request == "GET" && req.http.cookie) {
 
1257
     return(lookup);
 
1258
  }
 
1259
}
 
1260
 
 
1261
sub vcl_fetch {
 
1262
  if (beresp.http.Set\-Cookie) {
 
1263
     return(deliver);
 
1264
 }
 
1265
}
 
1266
.ft P
 
1267
.fi
 
1268
.sp
 
1269
The following code implements the HTTP PURGE method as used by Squid
 
1270
for object invalidation::
 
1271
.sp
 
1272
.nf
 
1273
.ft C
 
1274
acl purge {
 
1275
  "localhost";
 
1276
  "192.0.2.1"/24;
 
1277
}
 
1278
 
 
1279
sub vcl_recv {
 
1280
  if (req.request == "PURGE") {
 
1281
    if (!client.ip ~ purge) {
 
1282
      error 405 "Not allowed.";
 
1283
    }
 
1284
    return(lookup);
 
1285
  }
 
1286
}
 
1287
 
 
1288
sub vcl_hit {
 
1289
  if (req.request == "PURGE") {
 
1290
    purge;
 
1291
    error 200 "Purged.";
 
1292
  }
 
1293
}
 
1294
 
 
1295
sub vcl_miss {
 
1296
  if (req.request == "PURGE") {
 
1297
    purge;
 
1298
    error 200 "Purged.";
 
1299
  }
 
1300
}
 
1301
.ft P
 
1302
.fi
 
1303
.SH SEE ALSO
 
1304
.INDENT 0.0
 
1305
.IP \(bu 2
 
1306
varnishd(1)
 
1307
.IP \(bu 2
 
1308
vmod_std(7)
 
1309
.UNINDENT
 
1310
.SH HISTORY
 
1311
.sp
 
1312
VCL was developed by Poul\-Henning Kamp in cooperation with Verdens
 
1313
Gang AS, Redpill Linpro and Varnish Software.  This manual page was
 
1314
written by Dag\-Erling Smørgrav and later edited by Poul\-Henning Kamp
 
1315
and Per Buer.
 
1316
.SH COPYRIGHT
 
1317
.sp
 
1318
This document is licensed under the same license as Varnish
 
1319
itself. See LICENSE for details.
 
1320
.INDENT 0.0
 
1321
.IP \(bu 2
 
1322
Copyright (c) 2006 Verdens Gang AS
 
1323
.IP \(bu 2
 
1324
Copyright (c) 2006\-2011 Varnish Software AS
 
1325
.UNINDENT
 
1326
.SH AUTHOR
 
1327
Dag-Erling Smørgrav, Poul-Henning Kamp, Kristian Lyngstøl, Per Buer
 
1328
.\" Generated by docutils manpage writer.
 
1329
.\" 
 
1330
.