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