Re: How to write $upstream_trailer_{name} into access.log
Hello! On Tue, May 25, 2021 at 11:07:38AM +0300, Gena Makhomed wrote: [...] > Остается только одна небольшая проблема - если в server или в location > присутствуют свои директивы add_header, то там надо будет продублировать > вручную эти две директивы add_header с уровня http. Традиционное решение - использовать include-файл со "стандартными" заголовками, и при необходимости включать его там, где нужно не переопределить, а дополнить добавляемые заголовки. > Можно ли добавить в nginx директиву, например, force_add_header, > которая будет почти во всем аналогична директиве add_header, > но только директива add_header не будет отменять действие > директивы force_add_header, а директива force_add_header > не будет отменять действие директивы add_header. > > В случае коллизии - одно и то же имя заголовка задается > и директивой force_add_header и директивой add_header > в каком-то location - тогда пишется warning во время > тестирования конфигурации и действует только директива > force_add_header, два заголовка с одним и тем же именем > не добавляются в ответ сервера. Нет, нельзя. Возможно, когда-нибудь добавится концепция "явно унаследовать список с предыдущего уровня и дать возможность дополнить его", что-нибудь вроде add_header inherit; add_header Foo bar; Что по сути аналогично использованию include-файла, но чуть проще синтаксически. Но это, скажем так, очень абстрактная идея, реализация которой под очень большим вопросом. -- Maxim Dounin http://mdounin.ru/ ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: How to write $upstream_trailer_{name} into access.log
On 24.05.2021 4:19, Maxim Dounin wrote: add_trailer X-Response-Time $upstream_response_time always; add_trailer X-Cache-Status $upstream_cache_status always; Чтение трейлеров от бэкендов сейчас поддерживается только для gRPC-бэкендов. Если хочется, чтобы работало и для HTTP/1.1 с chunked - присылайте патчи. У trailers есть один существенный недостаток - они отсутствуют в ответах, состоящих из одних только заголовков, например, в ответах на HEAD-запросы. Поэтому trailers мне не подходят. Если использовать вариант: add_header X-Cache-Status $upstream_cache_status always; add_header X-Response-Time $upstream_header_time always; $upstream_header_time примерно равно $upstream_response_time, для большинства обычных сайтов, кроме того - эти два заголовка будуть присутствовать в ответах бэкенда всегда, даже для ответов на HEAD-запросы. Это есть примерно то, чего и хотелось получить. Остается только одна небольшая проблема - если в server или в location присутствуют свои директивы add_header, то там надо будет продублировать вручную эти две директивы add_header с уровня http. Можно ли добавить в nginx директиву, например, force_add_header, которая будет почти во всем аналогична директиве add_header, но только директива add_header не будет отменять действие директивы force_add_header, а директива force_add_header не будет отменять действие директивы add_header. В случае коллизии - одно и то же имя заголовка задается и директивой force_add_header и директивой add_header в каком-то location - тогда пишется warning во время тестирования конфигурации и действует только директива force_add_header, два заголовка с одним и тем же именем не добавляются в ответ сервера. Тогда можно было бы всего один раз на уровне http прописать force_add_header X-Cache-Status $upstream_cache_status always; force_add_header X-Response-Time $upstream_header_time always; и тогда в каждом ответе бэкенда присутствовали бы эти два заголовка, вне зависимости от того, где в server или в location встречаются директивы add_header и в каком количестве. Это было бы очень удобно. -- Best regards, Gena ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: How to write $upstream_trailer_{name} into access.log
Из документации как это понять On Mon, May 24, 2021, 6:19 AM Maxim Dounin wrote: > Hello! > > On Sun, May 23, 2021 at 01:00:18AM +0300, Gena Makhomed wrote: > > > Здравствуйте, All! > > > > Использую 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 > > > > Ожидается что в лог будут записаны полученные значения этих переменных, > > но вместо них в лог пишутся символы - - обозначающие пустые значения. > > > > Почему так происходит? Это ошибка в nginx или я что-то делаю не так? > > Чтение трейлеров от бэкендов сейчас поддерживается только для > gRPC-бэкендов. Если хочется, чтобы работало и для HTTP/1.1 с > chunked - присылайте патчи. > > -- > Maxim Dounin > http://mdounin.ru/ > ___ > nginx-ru mailing list > nginx-ru@nginx.org > http://mailman.nginx.org/mailman/listinfo/nginx-ru ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: How to write $upstream_trailer_{name} into access.log
Hello! On Sun, May 23, 2021 at 01:00:18AM +0300, Gena Makhomed wrote: > Здравствуйте, All! > > Использую 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 > > Ожидается что в лог будут записаны полученные значения этих переменных, > но вместо них в лог пишутся символы - - обозначающие пустые значения. > > Почему так происходит? Это ошибка в nginx или я что-то делаю не так? Чтение трейлеров от бэкендов сейчас поддерживается только для gRPC-бэкендов. Если хочется, чтобы работало и для HTTP/1.1 с chunked - присылайте патчи. -- Maxim Dounin http://mdounin.ru/ ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: How to write $upstream_trailer_{name} into access.log
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 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: How to write $upstream_trailer_{name} into access.log
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 ожидает увидеть _до_ тела. -- Best regards, Andrey A. Kopeyko ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: How to write $upstream_trailer_{name} into access.log
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 на бэкенде они имеют не пустые значения и пишутся в лог бэкенда. Подробнее - см. в документации описание переменных $sent_trailer_{name} $upstream_trailer_{name} http://nginx.org/en/docs/varindex.html http://nginx.org/ru/docs/varindex.html А что вам мешает писать в лог значения $upstream_response_time и $upstream_cache_status из которых вы свои кастомные заголовки строите? В лог бэкенда я их так и пишу, напрямую, как $upstream_response_time $upstream_cache_status Но хотелось бы эти же самые значения видеть и в логе фронтенда. (Это надо для более эффективной борьбы с DDoS-атаками на сайты) Передать их с бэкенда на фронтенд удобнее всего будет с помощью директивы add_trailer - она у меня больше нигде в конфиге не используется, так что описать эти две директивы можно будет всего один раз на уровне http и они будут работать для всех сайтов. -- Best regards, Gena ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: How to write $upstream_trailer_{name} into access.log
Gena Makhomed писал 2021-05-23 01:00: Здравствуйте, All! Добрый день, Геннадий! Использую 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: " - вы их сами выдумали. А что вам мешает писать в лог значения $upstream_response_time и $upstream_cache_status из которых вы свои кастомные заголовки строите? Это ошибка в nginx или я что-то делаю не так? -- Best regards, Andrey A. Kopeyko ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
How to write $upstream_trailer_{name} into access.log
Здравствуйте, All! Использую 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 Ожидается что в лог будут записаны полученные значения этих переменных, но вместо них в лог пишутся символы - - обозначающие пустые значения. Почему так происходит? Это ошибка в nginx или я что-то делаю не так? -- Best regards, Gena ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru