Несколько условий map в Nginx
Мне необходимо исключить из логов acccess все записи с указанными адресами, для этого пишу:
map $remote_addr $no_log_by_ip {
"xx.xx.xx.xx" 0;
default 1;
}
access_log /path_to_log/access.log combined if=$no_log_by_ip;
Также необходимо исключить из логов acccess все записи с кодом 403, пишу:
map $status $no_log_by_status {
403 0;
default 1;
}
access_log /path_to_log/access.log combined if=$no_log_by_status;
По отдельности это работает. Как можно сделать, чтобы одновременно работали оба условия, т.е. чтобы в логах не было записей с указанными ip и записей 403 с любых ip?
Пробовал:
access_log /path_to_log/access.log combined if=$no_log_by_status if=$no_log_by_ip;
Но работает только последний if, т.е. в данном случае if=$no_log_by_ip.
Ответы (1 шт):
Для проверки IP лучше использовать модуль geo.
Два if=..
в access_log
использовать нельзя, но можно в map
использовать переменные.
Получится как-то так:
geo $no_log_by_ip {
default 1;
xx.xx.xx.xx 0;
}
map $status $no_log {
default $no_log_by_ip;
403 0;
}
server {
access_log /path_to_log/access.log combined if=$no_log;
...
}
UPD: можно писать 403 в отдельный лог. Для этого нужно добавить ещё одну директиву access_log
со своим условием:
...
map $status $blocked_log {
default 0;
403 1;
}
server {
access_log /path_to_log/access.log combined if=$no_log;
access_log /path_to_log/blocked.log combined if=$blocked_log;
...
}