Varnish returns 503 error.

Abraham Cruz Sustaita abraham.sustaita at buscacorp.com
Thu Jun 14 20:34:45 CEST 2012


Actually I'm very newbbie in this varnish stuff, so I don't figure yet how
to use the log at varnishlog, but I did what they suggested me. My vcl
configuration file its this and it is working now. I have marked strong the
changes I did in order to fix this:

backend app01 {
  .host = "app01.site.com";
  .port = "80";
  *.connect_timeout = 1.5s;*
*  .first_byte_timeout = 45s;*
  .between_bytes_timeout = 30s;
  .probe = {
    .url = "/";
    .interval = 5s;
    .timeout = 1s;
    .window = 5;
    .threshold = 3;
  }
}

backend app02 {
  .host = "app02.site.com";
  .port = "80";
  *.connect_timeout = 1.5s;*
*  .first_byte_timeout = 45s;*
  .between_bytes_timeout = 30s;
  .probe = {
    .url = "/";
    .interval = 5s;
    .timeout = 1s;
    .window = 5;
    .threshold = 3;
  }
}

backend app03 {
  .host = "app03.site.com";
  .port = "80";
  *.connect_timeout = 1.5s;*
*  .first_byte_timeout = 45s;*
  .between_bytes_timeout = 30s;
  .probe = {
    .url = "/";
    .interval = 5s;
    .timeout = 1s;
    .window = 5;
    .threshold = 3;
  }
}

backend app04 {
  .host = "app04.site.com";
  .port = "80";
  *.connect_timeout = 1.5s;*
*  .first_byte_timeout = 45s;*
  .between_bytes_timeout = 30s;
  .probe = {
    .url = "/";
    .interval = 5s;
    .timeout = 1s;
    .window = 5;
    .threshold = 3;
  }
}

backend app05 {
  .host = "app05.site.com";
  .port = "80";
  *.connect_timeout = 1.5s;*
*  .first_byte_timeout = 45s;*
  .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; }
}

# Amazon S3 Backend
# --
backend s3 {
  .host = "site.s3-website-us-east-1.amazonaws.com";
  .port = "80";
}

#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.";
    }
    ban("req.url = " + req.url);
    return (lookup);
  }

  # Normalize the host header
  # --
  if (req.http.Host ~ "(?i)^(www.)?site.com") {
    set req.http.host = "www.site.com";
  }

  set req.backend = app_director;
  if (req.http.Host == "s3.site-files.site.com" && req.url ~
"\.(flv|mp4|jpg)$") {
    unset req.http.cookie;
    unset req.http.cache-control;
    unset req.http.pragma;
    unset req.http.expires;
    unset req.http.etag;
    unset req.http.X-Forwarded-For;

    set req.backend = s3;
    set req.http.host = "site.s3-website-us-east-1.amazonaws.com";

    return (lookup);
  }

  # 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" &&
   req.request != "HEAD" &&
   req.request != "PUT" &&
   req.request != "POST" &&
   req.request != "TRACE" &&
   req.request != "OPTIONS" &&
   req.request != "DELETE") {
    /* Non-RFC2616 or CONNECT which is weird. */
    return (pipe);
  }

  # Request by post needs no cache
  # --
  if (req.request == "POST") {
    return (pass);
  }

  # Admin needs no cache
  # --
  if (req.http.Host ~ "(?i)^(admin.)?site.com") {
    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);
  }

  # Login and logout needs no cache
  # --
  if (req.url ~ "^/usuario/salir" || req.url ~ "^/usuario/redirectWindow"
|| req.url ~ "^/usuario/al") {
    return (pass);
  }

  # Requests to /no-cache/ needs no cache
  # --
  if (req.request == "GET" && req.url ~ "^/no-cache") {
    return (pass);
  }
  if (req.request == "GET" && req.url ~ "^/rss/siterss") {
    return (pass);
  }

  # subdomain.site.com and other.com/foro/ needs no cache
  # --
  if (req.http.Host == "subdomain.site.com") {
    return (pass);
  }
  if (req.http.Host  == "www.other.com" && req.url ~ "^/foro/" &&
req.http.Cookie ~ "(?i)(somecookie|othercookie)") {
    return (pass);
  }

  # Not sure what could match here, but it's in the default.vcl
  # --
  if (req.request != "GET" && req.request != "HEAD") {
    /* We only deal with GET and HEAD by default */
    return (pass);
  }

  # 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") {
    purge;
    error 200 "Purged";
  }
}

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

sub vcl_fetch {

  # S3
  # --
  if (req.http.Host == "s3.site-files.site.com" && req.url ~
"\.(flv|mp4|jpg)$") {
    remove beresp.http.x-amz-id-2;
    remove beresp.http.x-amz-request-id;

    set beresp.ttl = 1w;
    set beresp.grace = 30s;

    if (beresp.status != 200) {
      return (error);
    }
  }

  # 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|mp4|flv)(\?[a-z0-9]+)?$") {
    unset beresp.http.set-cookie;
    set beresp.ttl = 12h;
  } else {
    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 || beresp.status == 503) {
    *if (req.restarts > 3) {*
*      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 > 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 {"
<html>
<head>
  <title>Pagina no disponible temporalmente</title>
  <style>
    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; }
  </style>
</head>
<body>
  <div id="page">
    <h1 class="title">Oops! Houston tenemos problemas!</h1>
    <p>La pagina que estas intentando ver por el momento no esta
disponible..</p>
    <p>Intenta <a href="">recargando la pagina </a> o puedes visitar <a
href="/">Nuestra pagina principal</a></p>
    <div class="error">(Error "} + obj.status + " " + obj.response +
{")</div>
  </div>
</body>
</html>
"};
  return (deliver);
}

sub vcl_init {
  return (ok);
}

sub vcl_fini {
  return (ok);
}


2012/6/14 Jean-Christian BEDIER <jc.bedier at gmail.com>

> Hello,
>
> I have the same problem too, on random request i read it in my varnishlog:
>
>   11 FetchError   c http first read error: -1 104 (Connection reset by
> peer)
>   13 BackendClose b farm1
>   11 VCL_call     c error
>   11 VCL_return   c deliver
>   11 VCL_call     c deliver
>   11 VCL_return   c deliver
>   11 TxProtocol   c HTTP/1.1
>   11 TxStatus     c 503
>
> Did you have the same Abraham ?
>
> Regards,
>
>
>
> On Thu, Jun 14, 2012 at 12:54 AM, Abraham Cruz Sustaita
> <abraham.sustaita at buscacorp.com> wrote:
> > Thanks a lot. I have made the change you suggested me and it seems its
> > working now.
> >
> > I'm still checking but I think its working very fine right now.
> >
> > Thanks a lot again.
> >
> >
> > 2012/6/13 Hugo Cisneiros (Eitch) <hugo.cisneiros at gmail.com>
> >>
> >> On Wed, Jun 13, 2012 at 5:51 PM, Abraham Cruz Sustaita
> >>
> >> <abraham.sustaita at buscacorp.com> wrote:
> >> > I understand varnish have to restart the connection and try again in
> >> > another app server (I have 5), but it allways returns the 503 error,
> so I
> >> > understand that means the rule is being ignored.
> >>
> >> The only way to be sure what is happening is to log details from the
> >> requests using varnishlog.
> >>
> >> The restart function will reset the request and it goes back to
> >> vcl_recv as if it is a new request. But since you're using saintmode,
> >> maybe varnish isn't really retrying to fetch this particular URL from
> >> the backend. You can do a
> >>
> >> if (req.restarts > 3) {
> >>  set beresp.saintmode = 5m;
> >> }
> >>
> >> and it will restart at least 2 times before inserting the item on
> >> saintmode.
> >>
> >> > I have made this change to the vcl file:
> >> [...]
> >> > Do I have to increase also the first_byte_timeout?
> >>
> >> You need to increase only if the request isn't getting reply data in
> >> the first 30 seconds :) You can check this with varnishlog and
> >> varnishncsa to be sure.
> >>
> >> --
> >> []'s
> >> Hugo
> >> www.devin.com.br
> >>
> >> _______________________________________________
> >> varnish-misc mailing list
> >> varnish-misc at varnish-cache.org
> >> https://www.varnish-cache.org/lists/mailman/listinfo/varnish-misc
> >
> >
> >
> > _______________________________________________
> > varnish-misc mailing list
> > varnish-misc at varnish-cache.org
> > https://www.varnish-cache.org/lists/mailman/listinfo/varnish-misc
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.varnish-cache.org/lists/pipermail/varnish-misc/attachments/20120614/04522eea/attachment-0001.html>


More information about the varnish-misc mailing list