Error 503 Service Unavailable / Service Unavailable / Guru Meditation

Abraham Cruz Sustaita abraham.sustaita at buscacorp.com
Fri Jun 15 18:49:49 CEST 2012


I could fix the error by configuring my vcl like this (I have marked bold
the changes I had to make in order to fix it):

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);
}

 Abraham Cruz Sustaita

Leader Development

Mail: abraham.sustaita at buscacorp.com
Ph: +52 (664) 200.2213
F: +52 (664) 200.2234
M: +52 (664) 123.0312
Calle Brasil No. 8471. Col. Juárez, Tijuana Baja California, CP 22040

BuscaCorp.com <http://www.buscacorp.com/>   |
LevelUp.com<http://www.levelup.com/>
|   MetaTube.com <http://www.metatube.com/>   |
SanDiegoRed.com<http://www.sandiegored.com/>
|   Tarreo.com <http://www.tarreo.com/>

This e-mail message is intended only for the personal use of the
recipient(s) named above. This message may be an attorney-client
communication and as such privileged and confidential. If you are not an
intended recipient,you may not review, copy or distribute this message. If
you have received this communication in error, please notify us immediately
by e-mail and delete the original message.


Este mensaje es para uso personal de(los) destinatario(s) a cuyos nombres
se dirige. Este mensaje puede ser comunicación abogado-cliente y por tanto
es privilegiado y confidencial. Si usted no es la persona a quien se
intentó enviar este mensaje, no debe revisarlo, copiarlo o distribuirlo en
forma alguna. Si ha recibido este mensaje por error, por favor notifíquelo
inmediatamente por email y destruya el mensaje original.



2012/6/15 Tobias Eichelbrönner <tobias.eichelbroenner at lamp-solutions.de>

> Hello,
>
> > I have a wired problem with varnish, i get "Error 503 Service
> > Unavailable / Service Unavailable / Guru Meditation". This is not
> > happening all the time! If i restart varnishd all things are fine for
> > random 5-10 mins.
>
> you are probing url / on host:drr000x maybe this url is not configured,
> or the host unknown.
>
> Have you tried "lynx http://drr0001/" on the varnish machine?
>
> Sincerely
>
> _______________________________________________
> 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/20120615/4c320955/attachment-0001.html>


More information about the varnish-misc mailing list