January 13, 2020 03:07PM
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 имеют одну длину. Но, как показала практика, это не всегда так. В связи с этим ещё один, вероятно последний, вопрос. Есть ли возможность сделать это поведение более предсказуемым? Или проще добавлять недостающие элементы массива в процессе обработки (по сути угадывая, что там должно быть)?
Subject Author Posted

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

Maxim Dounin December 27, 2019 09:14AM

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

yanda.a December 27, 2019 10:03AM

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

yanda.a December 27, 2019 10:10AM

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

Maxim Dounin December 27, 2019 12:04PM

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

yanda.a December 30, 2019 03:21AM

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

Maxim Dounin December 31, 2019 06:00AM

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

yanda.a January 13, 2020 04:46AM

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

Maxim Dounin January 13, 2020 07:34AM

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

yanda.a January 13, 2020 08:12AM

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

yanda.a January 13, 2020 08:14AM

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

Maxim Dounin January 13, 2020 02:40PM

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

yanda.a January 13, 2020 03:07PM

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

Maxim Dounin January 14, 2020 07:48AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 127
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready