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

2021-05-25 Пенетрантность Maxim Dounin
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

2021-05-25 Пенетрантность Gena Makhomed

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

2021-05-23 Пенетрантность Илья Шипицин
Из документации как это понять

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

2021-05-23 Пенетрантность Maxim Dounin
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

2021-05-22 Пенетрантность Andrey Kopeyko

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

2021-05-22 Пенетрантность Andrey Kopeyko

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

2021-05-22 Пенетрантность Gena Makhomed

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

2021-05-22 Пенетрантность Andrey Kopeyko

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

2021-05-22 Пенетрантность Gena Makhomed

Здравствуйте, 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