<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">пн, 14 окт. 2019 г. в 18:09, Maxim Dounin <<a href="mailto:mdounin@mdounin.ru">mdounin@mdounin.ru</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello!<br>
<br>
On Sun, Oct 13, 2019 at 02:18:30PM +0500, Илья Шипицин wrote:<br>
<br>
> привет,<br>
> <br>
> предыстория. видим ошибку в логах. вспоминаем концепцию, что с уровнем<br>
> error логируются ошибки на стороне сервера. считаем, что ошибка<br>
> действительно была. идем к клиенту - у клиента статус 200, ему хорошо, все,<br>
> что он хотел считать, он вычитал. повторяем несколько раз, в большинстве<br>
> случаев ситуация повторяется, в логах ошибка, у клиента все хорошо.<br>
> <br>
> ок. идем смотреть исходники<br>
> <br>
> вывод сообщения об ошибке встречается три раза<br>
> <br>
> ./nginx-1.17.4/src/http/ngx_http_upstream.c:<br>
>  "upstream prematurely closed connection");<br>
> ./nginx-1.17.4/src/http/ngx_http_upstream.c:<br>
>    "upstream prematurely closed connection");<br>
> ./nginx-1.17.4/src/http/ngx_http_upstream.c:<br>
>  "upstream prematurely closed connection");<br>
> <br>
> в двух случаях запрос завершается статусом 502<br>
> <br>
> ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);<br>
> <br>
> <br>
> в одном месте - не завершается:<br>
> <a href="http://hg.nginx.org/nginx/file/tip/src/http/ngx_http_upstream.c#l2369" rel="noreferrer" target="_blank">http://hg.nginx.org/nginx/file/tip/src/http/ngx_http_upstream.c#l2369</a><br>
<br>
Да, если ошибка происходит при чтении заголовка ответа - nginx <br>
пробует перейти к следующему бэкенду, так как это ещё возможно.  <br>
Что, однако же, не означает, что ошибки нет - она есть.<br></blockquote><div><br></div><div>по наблюдаемой картинке - да, похоже, в этом дело и было.</div><div>получаем 0 из recv во время чтения заголовков, запрос переотправляется, в целом он получается успешный<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
> собственно, recv в некоторых случаях может выдавать 0 и это не всегда<br>
> ошибка (у нас CentOS 7, возможно, там какая-то своя магия еще, с<br>
> какими-нибудь сетевыми штуками бекпортированными в ядро 3.10)<br>
> <br>
> man recv<br>
> ...<br>
> "The value 0 may also be returned if the requested number of bytes to<br>
> receive from a stream socket was 0."<br>
> <br>
> собственно, в этом месте меняем текст. и, чудо, после этого залогированные<br>
> "upstream prematurely closed connection" идеально кореллируют с реальными<br>
> обрывами.<br>
> <br>
> вопрос - в этом месте действительно стоит логировать ошибку с таким текстом<br>
> ? может поменять уровень на info (или debug), а текст сделать что-то типа<br>
> "zero bytes read from recv" ?<br>
<br>
Если recv() возвращает 0 байт - в предположении, что буфер был не <br>
нулевого размера - то это означает, что соединение закрыто "той <br>
стороной".  Если это происходит в момент времени, не <br>
предусмотренный протоколом - то это ошибка, и она логгируется <br>
соответственно.<br>
<br>
-- <br>
Maxim Dounin<br>
<a href="http://mdounin.ru/" rel="noreferrer" target="_blank">http://mdounin.ru/</a><br>
_______________________________________________<br>
nginx-ru mailing list<br>
<a href="mailto:nginx-ru@nginx.org" target="_blank">nginx-ru@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx-ru" rel="noreferrer" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-ru</a></blockquote></div></div>