Пишем в отдельные файлы ошибку 404 и все коды 5XX. Добавляем в секцию http:
map $status $to404log { 404 1; default 0;} map $status $to5XXlog { ~^[5] 1; default 0;}И потом в тот виртуальный хост, для которого это настаиваем:
access_log /var/log/nginx/404.log combined if=$to404log;access_log /var/log/nginx/5XX.log combined if=$to5XXlog;Теперь все запросы со статусом 404 будут писаться в лог 404.log, а все 500-е ошибки в лог 5XX.log. При этом в общий лог они тоже будут попадать.
Работает модуль map очень просто. В данном случае мы используем встроенную переменную $status, в которой хранится код ответа на запрос. Если код будет 404, то мы назначаем созданной нами переменной $to404log значение 1. А затем в виртуальном сервере указываем через if, что если значение 1, то пишем запрос в лог. А для 500-х ошибок используем регулярное выражение, которое будет включать их все.
По аналогии можно сделать блокировку определённых user-agent. Как раз для них я очень давно использую готовую конструкцию и баню наиболее известных ботов:
map $http_user_agent $block_useragent { default 0; ~*semrushbot 1; ~*ahrefs 1; ~*rss2tg 1; ~*seznambot 1; ~*AspiegelBot 1; ~*BLEXBot 1; ~*MASHIAH 1; }Добавляю в виртуальный хост:
if ($block_useragent) { return 403;}Думаю, принцип понятен. По аналогии можно блокировать разные типы запросов через переменную $request_method, какие-то урлы для каких-то user agent. Модуль geoip тоже удобно через map использовать с помощью переменной $geoip_country_code, и т.д.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#nginx
