Однажды мне понадобилось дополнительно вести лог запросов 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