Nginx. Использование модуля map

Однажды мне понадобилось дополнительно вести лог запросов 404 в отдельный файл, с дальнейшим экспортом его через rsyslog в mysql базу данных и обработкой скриптами.

Приведу пример регистрации запросов с кодом 4хх и 404:

map $status $loggable {
    ~^[4]   1;
    default 0;
}
map $status $loggable {
    ~^[404]   1;
    default 0;
}

Потом укажем куда сохранять логи таких запросов:

access_log /var/log/nginx/ixnfo.com_404.log combined if=$loggable;

Если в конфигурации уже есть access_log /var/log/nginx/access.log например, то в него по прежнему будут записываться все access логи, а в 404.log только с кодом 404.

map нужно указывать не в директиве server, а например можно перед ней, а access_log в server нужного сервера, например:

map $status $loggable {
    ~^[4]   1;
    default 0;
}

server {
   listen 443
   access_log /var/log/nginx/ixnfo.com_access.log;
   error_log /var/log/nginx/ixnfo.com_error.log;
   access_log /var/log/nginx/ixnfo.com_4xx.log combined if=$loggable;
...

Также map можно использовать с GeoIP:

apt install libnginx-mod-http-geoip geoip-database
nano /etc/nginx/conf.d/geoip.conf
map $geoip_country_code $allowed_country {
default no;
UA yes;
US yes;

server {
   listen 443

   # ru.wikipedia.org/wiki/ISO_3166-1
   if ($allowed_country = no) {
   return 444;
   }

Также можно выполнить переадресацию:

map $request_uri $new_uri {
    /old-url /new-url;
    /old.html /new.html;
}

server {
   listen 443
...
   if ($new_uri) {
       return 301 $new_uri;
    }

Проверим корректность конфигурации и применим ее:

nginx -t
service nginx restart
service nginx status

Смотрите другие мои статьи про Nginx

Оставьте комментарий

Добавить комментарий