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