How to write $upstream_trailer_{name} into access.log

Andrey Kopeyko andrey на kopeyko.ru
Вс Май 23 01:04:26 UTC 2021


Andrey Kopeyko писал 2021-05-23 03:57:
> Gena Makhomed писал 2021-05-23 01:50:
>> On 23.05.2021 1:25, Andrey Kopeyko wrote:
>> 
>>> Добрый день, Геннадий!
>> 
>> Здравствуйте, Андрей!
>> 
>>>> Использую nginx/1.19.10 из официального репозитория nginx.org
>>>> 
>>>> На бэкенде в секции http прописал такие директивы:
>>>> 
>>>> add_trailer X-Response-Time $upstream_response_time always;
>>>> add_trailer X-Cache-Status $upstream_cache_status always;
>>>> 
>>>> На фронтенде в секции http прописал proxy_http_version 1.1;
>>>> Также на фронтенде в директиву log_format добавил переменные:
>>>> 
>>>> $upstream_trailer_x_response_time $upstream_trailer_x_cache_status
>>>> 
>>>> Ожидается что в лог будут записаны полученные значения этих 
>>>> переменных,
>>>> но вместо них в лог пишутся символы - - обозначающие пустые 
>>>> значения.
>>>> 
>>>> Почему так происходит?
>>> 
>>> Очевидно, потому что бэкенд _не_ возвращал вам заголовков 
>>> "trailer-x-response-time: " - вы их сами выдумали.
>> 
>> trailer fields at the end of the message - это не заголовки.
>> 
>> Бэкенд эти trailers возвращает, я проверял переменные
>> 
>> $sent_trailer_x_response_time $sent_trailer_x_cache_status
>> 
>> на бэкенде они имеют не пустые значения и пишутся в лог бэкенда.
> 
> Стало понятнее.
> 
> Предположу, что в переменные $upstream_ они не попадают, т.к.
> передаются бэкендом _после_ тела ответа, а заголовки nginx ожидает
> увидеть _до_ тела.

Наверное, я не прав - судя по документации, они должны "подкладываться" 
к $upstream_ переменным

     $upstream_trailer_имя
     хранит поля из конца ответа, полученного от сервера группы 
(1.13.10).

     
https://nginx.org/ru/docs/http/ngx_http_upstream_module.html#variables


Похоже на багу, раз "не подкладываются".


-- 
Best regards,
Andrey A. Kopeyko <andrey at kopeyko.ru>


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