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

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

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

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

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

1
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 нужного сервера, например:

1
2
3
4
5
6
7
8
9
10
11
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:

1
2
apt install libnginx-mod-http-geoip geoip-database
nano /etc/nginx/conf.d/geoip.conf
1
2
3
4
5
6
7
8
9
10
11
12
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;
   }

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

1
2
3
4
5
6
7
8
9
10
11
map $request_uri $new_uri {
    /old-url /new-url;
    /old.html /new.html;
}
 
server {
   listen 443
...
   if ($new_uri) {
       return 301 $new_uri;
    }

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

1
2
3
nginx -t
service nginx restart
service nginx status

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

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

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