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