Re: Поведение nginx после ошибки "no live upstreams"

Vladimir Homutov vl на nginx.com
Ср Сен 2 10:15:36 UTC 2015


On Wed, Sep 02, 2015 at 05:55:49AM -0400, xore wrote:
> Добрый день.
>
> Не могу понять поведение nginx при возникновении ошибки:
> "no live upstreams while connecting to upstream, client: x.x.x.x, ..."
>
> Я предполагал, что когда все серверы в upstream становятся недоступными,
> nginx начинает отвечать 502, пока у какого-то сервера не кончится
> fail_timeout.
> Но практика показывает, что после ошибки "no live upstreams", nginx
> продолжает отправлять запросы на серверы в upstream.
> Не подскажут ли знающее люди, почему так?

http://hg.nginx.org/nginx/file/281863981d0b/src/http/ngx_http_upstream_round_robin.c#l497

>
> Тестировал командой:
> siege -t 10S -c 10 -b -v 'http://server/url'
>
> Конфиг:
> upstream test_backend {
>     server test1:5020;
>     server test2:5020;
>     server test3:5020;
>     server test4:5020;
>     keepalive 128;
> }
>
> server {
>     ...
>
>     location / {
>         proxy_pass        http://test_backend;
>         proxy_next_upstream error timeout http_503;
>         proxy_http_version 1.1;
>         proxy_set_header Connection "";
>     }
> }
>
> На серверах, указанных в upstream, крутится python сервис через uwsgi.
> nginx хочет keepalive и пытается посылать много запросов в одном TCP
> соединении.
> А у uwsgi keepalive не включен, поэтому он принимает только один запрос и
> закрывает TCP соединение.
> Соответственно, nginx получает отлуп (в виде RST пакета) на каждый второй
> запрос в TCP соединении.
> Отсюда возникает много ошибок "recv() failed" и "upstream prematurely closed
> connection".
> При таком поведении, у nginx в upstream должны очень быстро кончаться живые
> серверы и он должен переставать отвечать на запросы.
>
> Смотрю в лог:
>
> 2015/09/02 12:23:46 [error] 6978#6978: *27035 recv() failed (104: Connection
> reset by peer) while reading response header from upstream, client: x.x.x.x,
> ...
> 2015/09/02 12:23:46 [error] 6978#6978: *27095 recv() failed (104: Connection
> reset by peer) while reading response header from upstream, client: x.x.x.x,
> ...
> 2015/09/02 12:23:46 [error] 6978#6978: *27285 recv() failed (104: Connection
> reset by peer) while reading response header from upstream, client: x.x.x.x,
> ...
> 2015/09/02 12:23:46 [error] 6979#6979: *27295 recv() failed (104: Connection
> reset by peer) while reading response header from upstream, client: x.x.x.x,
> ...
> 2015/09/02 12:23:46 [error] 6980#6980: *27391 recv() failed (104: Connection
> reset by peer) while reading response header from upstream, client: x.x.x.x,
> ...
> 2015/09/02 12:23:46 [error] 6980#6980: *27423 recv() failed (104: Connection
> reset by peer) while reading response header from upstream, client: x.x.x.x,
> ...
> 2015/09/02 12:23:46 [error] 6979#6979: *27545 recv() failed (104: Connection
> reset by peer) while reading response header from upstream, client: x.x.x.x,
> ...
> 2015/09/02 12:23:46 [error] 6984#6984: *27761 upstream prematurely closed
> connection while reading response header from upstream, client: x.x.x.x,
> ...
> 2015/09/02 12:23:46 [error] 6984#6984: *27761 no live upstreams while
> connecting to upstream, client: x.x.x.x, ...
> 2015/09/02 12:23:46 [error] 6984#6984: *27780 recv() failed (104: Connection
> reset by peer) while reading response header from upstream, client: x.x.x.x,
> ...
> 2015/09/02 12:23:47 [error] 6984#6984: *27938 recv() failed (104: Connection
> reset by peer) while reading response header from upstream, client: x.x.x.x,
> ...
> 2015/09/02 12:23:47 [error] 6984#6984: *27962 recv() failed (104: Connection
> reset by peer) while reading response header from upstream, client: x.x.x.x,
> ...
> 2015/09/02 12:23:47 [error] 6980#6980: *28090 recv() failed (104: Connection
> reset by peer) while reading response header from upstream, client: x.x.x.x,
> ...
> 2015/09/02 12:23:47 [error] 6980#6980: *28140 recv() failed (104: Connection
> reset by peer) while reading response header from upstream, client: x.x.x.x,
> ...
>
> Думаю "какого черта, он в продолжает посылать запросы, если нет живых
> серверов?".
> Буду рад, если объясните, как так получается.
>
> Posted at Nginx Forum: http://forum.nginx.org/read.php?21,261379,261379#msg-261379
>
> _______________________________________________
> nginx-ru mailing list
> nginx-ru на nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru



Подробная информация о списке рассылки nginx-ru