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