Задача – логгировать все запросы, кроме 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]
Готово.