map для вывод записей в error.log по условию
dim1
nginx-forum на forum.nginx.org
Пт Май 27 19:09:37 UTC 2016
Проблема:
В логе есть множество не нужных 404 ошибок. Например, c перебором всего URL.
Пример с юзерагентом WhatsApp:
http://domen.com/category/subcategory/subsubcategory/page
http://domen.com/category/subcategory/subsubcategory/pag
http://domen.com/category/subcategory/subsubcategory/pa
...
http://domen.com/c
Кстати, зачем он так делает?!
ЗАДАЧА:
Писать в отдельный error.log только записи с реферером, исключая некоторые
UA.
РЕАЛИЗАЦИЯ:
map "$http_user_agent" $iswa {
default 1;
~WhatsApp 0;
}
map "$http_referer:$iswa:$status" $log404 {
default 0;
~^http.+:1:4[0-9][0-9] 1;
~^http.+:1:50[0-9] 1;
}
...
sever {
access_log /path/domen.error.log combined if=$log404;
...
}
Записываем в отдельный лог все UA кроме WhatsApp, и только 4хх и 50х ошибки
(4[0-9][0-9] и 50[0-9]), при НЕ пустом реферере (^http.+).
Если вместо ^http.+ поставить .+ заметно увеличивается нагрузка.
~.+ - заметно грузит nginx (вместо 2% на процесс - получается 7%)
~^http.+ - не так сильно грузит процессор.
ВОПРОСЫ:
1. Верна ли реализация, в общем?
2. Какой регуляркой лучше указывать - НЕ пустая строка? Странно, что так
сильно грузит ~.+.
3. Имеет ли значение порядок переменных в map? Возможно простые условия (без
регулярок) лучше ставить первыми?
4. Есть ли возможность указать ! (NOT) для условия в map?
Posted at Nginx Forum: https://forum.nginx.org/read.php?21,267206,267206#msg-267206
Подробная информация о списке рассылки nginx-ru