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

xore nginx-forum на nginx.us
Ср Сен 2 09:55:49 UTC 2015


Добрый день.

Не могу понять поведение nginx при возникновении ошибки:
"no live upstreams while connecting to upstream, client: x.x.x.x, ..."

Я предполагал, что когда все серверы в upstream становятся недоступными,
nginx начинает отвечать 502, пока у какого-то сервера не кончится
fail_timeout.
Но практика показывает, что после ошибки "no live upstreams", nginx
продолжает отправлять запросы на серверы в upstream.
Не подскажут ли знающее люди, почему так?

Тестировал командой:
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