В nginx есть три location’а (cash, static, backend). Логи пишутся в access log. Как по логам определить, из какого location был отдан контент пользователю?

«В nginx есть три location’а (cash, static, backend). Логи пишутся в access log. Как по логам определить, из какого location был отдан контент пользователю?» — вопрос из категории Веб-серверы и балансировка, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Стандартный формат логов nginx не указывает, какой именно location обработал запрос. Для этого нужно добавить пользовательскую переменную в конфигурацию.

Решение: Добавление переменной $location_name в log_format.

  1. Определите кастомный формат лога в блоке http:

    http {
        log_format location_log '$remote_addr - $remote_user [$time_local] '
                                '"$request" $status $body_bytes_sent '
                                '"$http_referer" "$http_user_agent" '
                                'location="$location_name"';
        ...
    }
  2. Внутри каждого location установите эту переменную и укажите использовать новый формат:

    server {
        access_log /var/log/nginx/access.log location_log;
    
        location /cash {
            set $location_name 'cash';
            # ... конфигурация location
        }
    
        location /static {
            set $location_name 'static';
            # ... конфигурация location
        }
    
        location /backend {
            set $location_name 'backend';
            # ... конфигурация location
        }
    }

Результат: В каждой строке лога появится поле location="cash" (или static, backend), что позволит легко фильтровать и анализировать трафик по конкретным location'ам с помощью grep, awk или лог-агрегаторов (ELK, Loki).