Upstream Backup Issue

Maxim Dounin mdounin at mdounin.ru
Fri Feb 13 13:35:28 MSK 2009


Hello!

On Thu, Feb 12, 2009 at 11:41:17PM -0500, Nathan Folkman wrote:

> Hi,
>
> We have the following configuration, running nginx 0.6.34:
>
> ...
> upstream frontend {
> 	server host_a;
> 	server host_b;
> 	server host_c;
> 	server host_d;
> 	server failover_host backup;
> }
>
> server {
>         listen 80;
>         server_name _;
>         error_page 502 503 504 /error.png;
>
>         location / {
>             proxy_set_header Host $host;
>             proxy_set_header X-Real-IP $remote_addr;
>             proxy_pass http://frontend;
>             proxy_connect_timeout 5;
>             proxy_send_timeout 30;
>             proxy_read_timeout 30;
>             charset utf-8;
>         }
> }
> ...
>
> Everything has been working great for weeks, and then today we started  
> seeing the following up stream errors:
>
> [error] 28016#0: *742426639 upstream sent invalid header while reading  
> response header from upstream, client: CLIENT, server: _, request: "GET 
> REQUEST HTTP/1.1", upstream: "ADDRESS", host: "HOST"
>
> The errors were caused by a malformed HTTP redirect message, that we  
> were constructing upstream, that contained embedded newline characters  
> in the "Location" HTTP header portion of the response. It seems like  
> what was happening was that once I'd get 4 of those errors, the backup  
> would kick in for a few seconds and then everything would recover.
>
> Is this correct behavior? The upstream hosts were technically not down, 
> and were all responding so there weren't any timeout issues. Is there a 
> way to prevent this from happening unless all of the upstream hosts are 
> truly down or non-responsive, as opposed to simply returning invalid 
> responses? Could this be a bug?

Technically you upstream hosts wasn't HTTP, so it's perfectly 
correct behaviour.

As you can read in docs, nginx threats upstream server as down 
according to max_fails and fail_timeout defined for this server.  
It considers requests as failed (and counts attempts against 
max_fails/fail_timeout) according to proxy_next_upstream 
directive, "proxy_next_upstream error timeout" by default.  In you 
case "error" is triggered (error occured while readin reponse 
header from upstream).

Maxim Dounin





More information about the nginx mailing list