Re: Отдельный лог файл для модуля ngx_http_limit_req_module

Maxim Dounin mdounin на mdounin.ru
Вт Мар 15 19:25:53 MSK 2011


Hello!

On Tue, Mar 15, 2011 at 06:52:30PM +0300, Alex Beljanski wrote:

> Доброго времени суток.
> В общем, ситуация такая.
> Есть модуль ngx_http_limit_req_module, работает отлично и выдает
> 503-ую ошибку кому надо. Ну т.е. в принципе с потоком всяких DDOS-еров
> справляется. Но вот хотелось бы чтобы он писал сообщение о том, что IP
> превысил порог запросов в отдельный файл, грубо говоря единый для
> виртуальных хостов.
> Сейчас у меня под каждый виртуальный хост свой error_log. Задать два
> error_log для виртуального хоста я как понял нельзя, потому что nginx
> ругаться начинает.
> Я просто думал на разные error_log повесить сообщения с разным уровнем
> логирования.
> Ну т.е. для основного оставить info, а для другого сделать warn, при
> этом указав в limit_req_log_level тоже уровень warn.
> 
> Такого сделать не получилось, вот поэтому хотелось бы чтобы модуль
> ngx_http_limit_req_module свое сообщение помещал в отдельный файл,
> чтобы из него можно было потом выдергивать IP и особо ретивых банить
> на фаерволе.
> 
> Я с nginx новичок, и если можно как-то по-другому решить мою задачу,
> буду только признателен.

Можно отправить обработку 503 в отдельный location, и там завести 
отдельный (или дополнительный) access_log, в который всё и будут 
попадать.  Как-то так:

    location / {
        error_page 503 /503.html;
        limit_req ...
        ...
    }

    location = /503.html {
        access_log /path/to/log format;
    }

В самом nginx'е 503 может возникнуть только из-за limit_req или 
limit_conn.  Но следует иметь ввиду, что если используется 
proxy_intercept_errors/fastcgi_intercept_errors - туда же попадут 
503-е ответы от бекендов.  При необходимости их отделять - надо 
логгировать значение $upstream_status, и проверять уже при анализе 
логов.

Maxim Dounin



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