Re: Пустая переменная $upstream status при 499

yanda.a nginx-forum на forum.nginx.org
Пн Янв 13 20:07:20 UTC 2020


Maxim Dounin Wrote:
-------------------------------------------------------
> Hello!
> 
> Где-то тут общение с бекендом завершено, однако ответ ещё не 
> полностью отправлен клиенту.  В процессе отправки клиенте 
> закрывает HTTP/2 stream:
Кстати да, я немного не досмотрел. В этом server {} не используется listen
http2. Но, в логах наблюдается именно http/2.0 и в хроме видно h2 в консоли
разработчика. Не могли бы вы подсказать, насколько это адекватно? 

> При этом в функции ngx_http_terminate_request(), которая обновляет 
> статус запроса тогда и только тогда, когда статус либо ещё не 
> стоит, либо клиенту вообще ничего не было отправлено.  В данном 
> случае, видимо, за счёт использования HTTP/2 случается ситуация, 
> когда клиенту вообще ничего не отправлено (вероятно, за счёт 
> других данных в соединении), и статус таки обновляется на 499.
> 
> Ситуация с $upstream_status "-", видимо, получается похожим 
> образом: если в процессе работы с бекендом клиент отменяет HTTP/2 
> stream, то у соответствующей этому stream'у структуре соединения 
> будет проставлен флаг c->error.  И если после этого случается 
> timeout бекенда, то в ngx_http_upstream_next() nginx, увидев 
> стоящий флаг c->error, не пойдёт на следующий бекенд, а вместо 
> этого завершит обработку запроса с кодом 499.
> 
> То есть я был неправ, получить в логах 499 при использовании 
> proxy_ignore_client_abort таки можно, хотя и непросто.  В простых 
> случаях это в основном затрагивает HTTP/2, но и в HTTP/1.x можно 
> получить похожее поведение, например, при использовании 
> подзапросов.
> 
> На практике при использовании proxy_ignore_client_abort это 
> означает, что работа с бекендом завершена или не начиналась.
> 
> Возвращаясь к исходному вопросу: да, текущее поведение выглядит 
> нормально.

Постараюсь описать ситуацию. Мы пытаемся выгружать эти логи в clickhouse для
анализа latency и работы бекендов в целом, и сбора разнообразной статистики.
Для этого на выходе у нас ожидается, что переменные (после парсинга это
массивы в нашем случае) $upstream_addr, $upstream_response_time и
$upstream_status имеют одну длину. Но, как показала практика, это не всегда
так. В связи с этим ещё один, вероятно последний, вопрос. Есть ли
возможность сделать это поведение более предсказуемым? Или проще добавлять
недостающие элементы массива в процессе обработки (по сути угадывая, что там
должно быть)?

Posted at Nginx Forum: https://forum.nginx.org/read.php?21,286606,286718#msg-286718



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