Добрый день. Не могу понять поведение 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 mailing list [email protected] http://mailman.nginx.org/mailman/listinfo/nginx-ru
