Поведение 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