Re: логирование location

Maxim Dounin mdounin на mdounin.ru
Ср Июн 23 21:01:27 MSD 2010


Hello!

On Wed, Jun 23, 2010 at 11:11:50PM +0700, Igor V. Fatkulin wrote:

> 
> Всем доброго времени суток.
> 
> Пытаюсь  сделать  запись  средствами  nginx  логирование  обращений  к
> определенному location, пытался сделать что-то типа:
> 
> location ~ ^/cgi-bin/script.cgi\?(.+)$ {
>          log_format  scriptlog '$http_referer';
>          access_log  logs/$1.log  scriptlog;
> }
> 
> по итогу  либо лог не создается, либо такое ощущение, что локейшн
> начинает  на  себя  сгребать  все  запросы  к скрипту, в результате все
> перестает работать.

Side note: ни разу не понятно какое отношение ваше письмо имеет к 
треду "Critical errors nginx под Windows 2003".  Если никакого - 
то зачем было отвечать в тред c In-Reply-To?

По существу:

1.  Вы неправильно понимаете как работают location'ы.  Для 
обработки запроса используется *только один location*.  Никакого 
волшебного склеивания конфигураций описанных в разных location'ах 
не происходит.

Если вы хотите чтобы запросы логгировались отдельно и отправлялись 
на апач - так и напишите в наиболее специфичном location'е для 
данных запросов.

2. При matching'е location'ов тестируется только путь из URL, 
т.е. "/cgi-bin/script.cgi".  Так что написанное про '\?(.+)' 
смысла не имеет и приведёт только к тому что данный location не 
будет срабатывать для запросов к /cgi-bin/script.cgi.

3. Регулярные выражения тут не нужны.  Идеально подойдёт location 
с проверкой точного совпадения.

Итого писать надо как-то так:

    location = /cgi-bin/script.cgi {
        access_log  /path/to/log  format;
        proxy_pass ...
    }

Если в имени log-файла действительно нужны аргументы запроса 
(настоятельно не рекомендую без нужды - это лишние открытия файлов 
на каждый запрос и лишний вектор для dos'а), то использовать 
переменную $args (aka $query_string).

Maxim Dounin



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