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

In our varnish config we have a vcl_fetch function defined as follows:

if (beresp.ttl > 0s) {
   /* Remove Expires from backend, it's not long enough */
   unset beresp.http.expires;

   /* Set the clients TTL on this object */
   set beresp.http.cache-control = "max-age=900";

   /* Set how long Varnish will keep it */
   set beresp.ttl = 1h;

   /* marker for vcl_deliver to reset Age: */
   set beresp.http.magicmarker = "1";

Then in vcl_deliver:

if (resp.http.magicmarker) {
   /* Remove the magic marker */
   unset resp.http.magicmarker;

   /* By definition we have a fresh object */
   set resp.http.age = "0";

The issue is that if I setup a script (either a shell script or a php script) to hit the same URL, I first see a MISS, followed by a HIT (all good so far).

What I am expecting to sit is repeated HITS until the 1 hour mark has passed, one MISS at the 1 hour mark, followed by an hour of HITs again. In other words because I'm hitting the same URL repeatedly it should cycle between HIT and MISS every 1 HOUR.

Instead what I see is something like this:

 6/20/2013 6:30:05 - STRING HIT NOT FOUND
 6/20/2013 10:32:11 - STRING HIT NOT FOUND
 6/21/2013 12:33:06 - STRING HIT NOT FOUND
 6/21/2013 2:34:06 - STRING HIT NOT FOUND

It's now 5:57AM (almost 4 hours since the HIT not found).

The cache misses above do all appear around the half hour mark but they're 4 hours, 2 hours and 2 hours apart and the TTL is set to 1 hour.

So I don't understand why the object is being kept longer than 1 hour and why its evicted at seemingly random intervals. How can I better determine whats going on?

By the way I am using varnish 3 if that helps.

share|improve this question
Are those the only changes you've made to your VCL? Why do you need to manipulate the Age header? Can you provide the output from varnishlog for these requests? – Shane Madden Jun 22 '13 at 7:24
up vote 0 down vote accepted

So the varnish server in question was caching a Drupal 7 site. In the Drupal 7 site we had the Drupal Varnish module configured and enabled.

As best as I can tell that was periodically clearing the cache. I was able to determine that using the following command and seeing BANs that I hadn't issued:

varnishadm -T localhost:6082 -S /etc/varnish/secret ban.list 
Present bans: 1371834738.031740 193 ~ && req.url ~ /
share|improve this answer

Your Answer


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

Not the answer you're looking for? Browse other questions tagged or ask your own question.