Несколько условий 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 шт):

Автор решения: Alexey Ten

Для проверки 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;
  ...
}
→ Ссылка