Задача — логгировать все запросы, кроме 200 ответов.
Подход с map можно использовать для совершенно разных вещей.
Например — задавать условия по наличию заголовка, и потом перенаправлять на различные location — попозже, наверно, добавлю такой пример.
Сейчас нас интересуют две возможности NGINX — «условное логгирование» для выбора условий, при которых будем заносить события в журнал, и map для создания переменных со значениями других переменных.
Содержание
map
В блоке http {} создаём переменную с именем $abnormal, в которой задаём значение 0 — если в коде ответа есть 200, или 1 — если нет:
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
map $status $abnormal {
~^200 0;
default 1;
}
...
Conditional logging
А затем в блоке server {} задаём условие, используя if: если в $abnormal значение ноль — то не пишем ничего, а если значение 1, которое задано default параметром в map — то записываем:
server {
charset utf-8;
listen 80 default_server;
server_name stage.example.com;
if ($http_x_forwarded_proto = 'http') {
return 301 https://stage.example.com$request_uri;
}
set $root_path /data/projects/frontend/web;
root $root_path;
index index.php;
error_log /var/log/nginx/stage.example.com-error.log;
access_log /var/log/nginx/stage.example.com-access.log combined if=$abnormal;
...
Проверяем:
[simterm]
127.0.0.1 - - [15/Mar/2019:14:51:37 +0200] "GET /nginx_status HTTP/1.1" 404 153 "-" "Go-http-client/1.1" 127.0.0.1 - - [15/Mar/2019:14:51:52 +0200] "GET /nginx_status HTTP/1.1" 404 153 "-" "Go-http-client/1.1"
[/simterm]
Готово.