title: varnish connection error
body: <p>I have this vcl varnish config file, but it is throwing an error when I wanto to purge from the app server. is there anything wrong on it?</p>
  
  <p>I have 5 app servers and everything except admin and forums are being cached, however, when I user purge from the app servers it throws this error: Failed to connect to varnishadm on 192.168.11.41:6082; "Conection rejected"</p>
  
  <pre><code>backend app01 {
    .host = "app01.xxx.com";
    .port = "80";
    .connect_timeout = 0.7s;
    .first_byte_timeout = 30s;
    .between_bytes_timeout = 30s;
    .probe = {
      .url = "/";
      .interval = 5s;
      .timeout = 1s;
      .window = 5;
      .threshold = 3;
    }
  }
  
  backend app02 {
    .host = "app02.xxx.com";
    .port = "80";
    .connect_timeout = 0.7s;
    .first_byte_timeout = 30s;
    .between_bytes_timeout = 30s;
    .probe = {
      .url = "/";
      .interval = 5s;
      .timeout = 1s;
      .window = 5;
      .threshold = 3;
    }
  }
  
  backend app03 {
    .host = "app03.xxx.com";
    .port = "80";
    .connect_timeout = 0.7s;
    .first_byte_timeout = 30s;
    .between_bytes_timeout = 30s;
    .probe = {
      .url = "/";
      .interval = 5s;
      .timeout = 1s;
      .window = 5;
      .threshold = 3;
    }
  }
  
  backend app04 {
    .host = "app04.xxx.com";
    .port = "80";
    .connect_timeout = 0.7s;
    .first_byte_timeout = 30s;
    .between_bytes_timeout = 30s;
    .probe = {
      .url = "/";
      .interval = 5s;
      .timeout = 1s;
      .window = 5;
      .threshold = 3;
    }
  }
  
  backend app05 {
    .host = "app05.xxx.com";
    .port = "80";
    .connect_timeout = 0.7s;
    .first_byte_timeout = 30s;
    .between_bytes_timeout = 30s;
    .probe = {
      .url = "/";
      .interval = 5s;
      .timeout = 1s;
      .window = 5;
      .threshold = 3;
    }
  }
  
  director app_director round-robin {
    { .backend = app01; }
    { .backend = app02; }
    { .backend = app03; }
    { .backend = app04; }
    { .backend = app05; }   
  }
  
  #acl internal {
  #  "localhost";
  #  "127.0.0.1";
  #}
  
  acl purge {
          "localhost";
          "192.168.11.0"/24;
  }
  
  sub vcl_recv {
  
    if (req.request == "PURGE") {
      if (!client.ip ~ purge) {
        error 405 "Not allowed.";
      }
      return (lookup);
    }
  
    # Normalize the host header
    # --
    if (req.http.Host ~ "(?i)^(www.)?xxx.com") {
      set req.http.host = "www.xxx.com";
    }
  
    # Admin needs no cache
    # --
    if (req.http.Host ~ "(?i)^(admin.)?xxx.com") {
      return (pass);
    }
  
    # Requests to /no-cache/ needs no cache
    # --
    if (req.request == "GET" &amp;&amp; req.url ~ "^/no-cache/") {
      return (pass);
    }
    if (req.request == "GET" &amp;&amp; req.url ~ "^/rss/xxx/") {
      return (pass);
    }
  
    # xx.xxx.com and xxx.com/foro/ needs no cache
    # --
    if (req.http.host == "xx.xxx.com" || (req.http.host == "www.xxx.com" &amp;&amp; req.url ~ "^/foro/" &amp;&amp; req.http.Cookie ~ "(?i)(cookieAdmin)") ) {
      return (pass);
    } 
  
    set req.backend = app_director;
  
    # Use anonymous, cached pages if all backends are down.
    if (! req.backend.healthy) {
      unset req.http.Cookie;
      set req.grace = 1h;
    } else {
      set req.grace = 30s;
    }
  
    # Add the X-Forwarded-For header
    # --
    if (req.restarts == 0) {
      if (req.http.x-forwarded-for) {
        set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
      } else {
        set req.http.X-Forwarded-For = client.ip;
      }
    }
  
    # Sanely handle the request based on the type
    # --
    if (req.request != "GET" &amp;&amp;
     req.request != "HEAD" &amp;&amp;
     req.request != "PUT" &amp;&amp;
     req.request != "POST" &amp;&amp;
     req.request != "TRACE" &amp;&amp;
     req.request != "OPTIONS" &amp;&amp;
     req.request != "DELETE") {
      /* Non-RFC2616 or CONNECT which is weird. */
      return (pipe);
    }
  
    # Not sure what could match here, but it's in the default.vcl
    # --
    if (req.request != "GET" &amp;&amp; req.request != "HEAD") {
      /* We only deal with GET and HEAD by default */
      # PURGE
      return (pass);
    }
  
    # Always cache the following file types for all users.
    if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|flv|avi|mov|wmv|css|js|html|htm)(\?[a-z0-9]+)?$") {
      unset req.http.Cookie;
      return (lookup);
    }
  
    # Handle compression correctly. Different browsers send different
    # "Accept-Encoding" headers, even though they mostly all support the same
    # compression mechanisms. By consolidating these compression headers into
    # a consistent format, we can reduce the size of the cache and get more hits.=
    # @see: http:// varnish.projects.linpro.no/wiki/FAQ/Compression
    if (req.http.Accept-Encoding) {
      if (req.http.Accept-Encoding ~ "gzip") {
        # If the browser supports it, we'll use gzip.
        set req.http.Accept-Encoding = "gzip";
      }
      else if (req.http.Accept-Encoding ~ "deflate") {
        # Next, try deflate if it is supported.
        set req.http.Accept-Encoding = "deflate";
      }
      else {
        # Unknown algorithm. Remove it and send unencoded.
        unset req.http.Accept-Encoding;
      }
    }
  
    # Cache all requests by default, overriding the standard Varnish behavior
    if (req.request == "GET" || req.request == "HEAD") {
      /* We only deal with GET and HEAD by default */
      unset req.http.Cookie;
      return (lookup);
    }
  
    # If there's a cookie left aft this point do not cache
    # or is this easier to keep in the cookie deletion above?
    # --
    if (req.http.Authorization || req.http.Cookie) {
      /* Not cacheable by default */
      return (pass);
    }
  
    # If we get here, try the cache
    # --
    return (lookup);
  
  }
  
  
  
  sub vcl_pipe {
    return (pipe);
  }
  
  sub vcl_pass {
    return (pass);
  }
  
  sub vcl_hash {
    # Include cookie in cache hash.
    # This check is unnecessary because we already pass on all cookies.
    #if (req.http.Cookie) {
    #  #set req.hash += req.http.Cookie;
    #  hash_data(req.http.Cookie);
    #}
  }
  
  sub vcl_hit {
    if (req.request == "PURGE") {
      set obj.ttl = 0s;
      error 200 "Purged";
    }
  }
  
  sub vcl_miss {
    if (req.request == "PURGE") {
      error 404 "Not in cache";
    }
  }
  
  sub vcl_fetch {
  
    # remove all cookies
    # unset beresp.http.set-cookie;
  
    # cache for 12 hours
    # set beresp.ttl = 2h;
  
    # Don't allow static files to set cookies.
    if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?[a-z0-9]+)?$") {
      unset beresp.http.set-cookie;
      set beresp.ttl = 12h;
    } else {
      unset beresp.http.set-cookie;
      set beresp.ttl = 30m;
    }
  
    # If the backend server doesn't return properly, don't send another connection to it
    # for 60s and try another backend via restart.
    #
    # https://www.varnish-cache.org/docs/trunk/tutorial/handling_misbehaving_servers.html
    # --
    if(beresp.status == 500) {
      set beresp.saintmode = 5m;
      if (req.request != "POST") {
        return(restart);
      } else {
        error 500 "Failed";
      }
    }
  
    # Allow items to be stale if needed.
    set beresp.grace = 1h;
  
  }
  
  sub vcl_deliver {
   # if (resp.http.magicmarker) {
   #   unset resp.http.magicmarker;
   #   set resp.http.age = "0";
   # }
  
    if (obj.hits &gt; 0) {
      set resp.http.X-Cache = "HIT";
    } else {
      set resp.http.X-Cache = "MISS";
    }
    return (deliver);
  }
  
  # In the event of an error, show friendlier messages.
  sub vcl_error {
    # Otherwise redirect to the homepage, which will likely be in the cache.
    set obj.http.Content-Type = "text/html; charset=utf-8";
    synthetic {"
  &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;Page Unavailable&lt;/title&gt;
    &lt;style&gt;
      body { background: #303030; text-align: center; color: white; }
      #page { border: 1px solid #CCC; width: 500px; margin: 100px auto 0; padding: 30px; background: #323232; }
      a, a:link, a:visited { color: #CCC; }
      .error { color: #222; }
    &lt;/style&gt;
  &lt;/head&gt;
  &lt;body onload="setTimeout(function() { window.location = '/' }, 5000)"&gt;
    &lt;div id="page"&gt;
      &lt;h1 class="title"&gt;Page Unavailable&lt;/h1&gt;
      &lt;p&gt;The page you requested is temporarily unavailable.&lt;/p&gt;
      &lt;p&gt;We're redirecting you to the &lt;a href="/"&gt;homepage&lt;/a&gt; in 5 seconds.&lt;/p&gt;
      &lt;div class="error"&gt;(Error "} + obj.status + " " + obj.response + {")&lt;/div&gt;
    &lt;/div&gt;
  &lt;/body&gt;
  &lt;/html&gt;
  "};
    return (deliver);
  }
  
  sub vcl_init {
    return (ok);
  }
  
  sub vcl_fini {
    return (ok);
  }
  </code></pre>