ПОЛЕВОЙ СПРАВОЧНИК / HTTPTRACE SAMPLE / 01  ·  HTTP

NGINX / МАРШРУТ ЗАПРОСА

Путь запроса
не угадывают.

Его трассируют. От listen до приложения, через каждый выбор server и location.

REQUEST / 001HTTP → UPSTREAM
listenадрес и порт
serverвиртуальный хост
locationвыбранный URI
handlerфайл или proxy
appпроверка прав
Host: api.demo.testURI: /private/export.php маршрут найден
ПОРТ 80 / 443ЗАПРОС → РЕШЕНИЕ → ОТВЕТ

Сначала механизм

NGINX не просто
«отдаёт сайт».

Он принимает соединения, выбирает виртуальный сервер, сопоставляет URI и решает, отдать файл, передать запрос upstream или завершить его.

Официальный Beginner’s Guide
MASTERконфигурация
и процессы
читает конфиг, запускает workers
WORKER 01соединения
WORKER 02запросы
WORKER Nсобытия

Событийная модель позволяет worker-процессу обслуживать множество соединений. Детали зависят от платформы и сборки. [1]

01 / WEB SERVER

Файлы, TLS и ответы на HTTP-запросы.

02 / REVERSE PROXY

Передача запроса приложению или группе upstream-серверов.

03 / ROUTER

Решение зависит от сокета, имени сервера, URI и контекста директив.

Интерактивная трасса / модель

Запусти запрос.
Посмотри, кто победил.

Меняй сценарий, Host и URI. Линия показывает путь, а результат объясняет выбранное правило.

Это ограниченные учебные примеры, а не полноценный парсер nginx.conf. Перед исправлением сверяйся с документацией и тестируй конфигурацию.

Выбери точку сбоя

Трасса запросаREADY
  1. listenадрес и порт
  2. serverвиртуальный хост
  3. locationвыбранный URI
  4. handlerфайл или proxy
  5. appпроверка прав
Развилка / locationодин URI · два кандидата
PREFIXlocation /private/совпал, но уступилdeny all
REGEXlocation ~ \\.php$выбранный блокapp:9000
Входapi.demo.test/private/export.php
Выбранный маршрутregex → http://app:9000

Обычный prefix совпал, но регулярное выражение для .php тоже совпадает. Без ^~ NGINX проверяет regex после выбора самого длинного prefix. В этой конфигурации regex location может стать победителем, поэтому deny all из prefix-блока не применяется.

Что проверить

Если весь /private/ должен оставаться закрытым, сделайте prefix ^~ и проверьте точный набор правил: location ^~ /private/ { deny all; }

Где ломается маршрут

Мисконфиг
виден по эффекту.

Ищи не «плохую директиву» отдельно, а расхождение между ожидаемым и фактическим маршрутом.

01locationPrefix и regex спорят за запросЗапрос к закрытому пути попадает в обработчик другого location.Проверьте exact, longest prefix, ^~ и порядок regex; закрепите поведение тестом.02root / aliasФайловый путь собран не такНужный файл не найден или открыт соседний каталог.Сопоставьте URI и путь на диске; не включайте autoindex без нужды.03server_nameНеизвестный Host выбрал не тот блокЗапрос с неожиданным Host обслуживает первый server на сокете.Задайте явный default_server и отдельно проверьте Host и TLS SNI.04proxy_passUpstream получил другой URIПриложение видит /users вместо /api/users или наоборот.Сравните proxy_pass со слэшем и без него на безопасном тестовом маршруте.05proxy headersBackend доверяет непроверенным заголовкамПриложение получает неверный IP, схему или имя хоста.Передавайте ожидаемые заголовки явно; доверяйте только известным прокси.06authorizationОграничение на edge приняли за авторизациюПрямой или альтернативный маршрут обходит проверку прав.Проверяйте пользователя и объект в приложении на каждом защищённом действии.

Настройка NGINX на edge не заменяет авторизацию и проверку прав в приложении. OWASP: Authorization Cheat Sheet ↗

Порядок проверки

Сначала конфиг.
Потом запрос.

Собери ожидаемый результат для Host и URI, затем проверь его на том же маршруте, который видит пользователь.

  1. 01

    Проверь синтаксис

    nginx -t

    Это ловит ошибки конфигурации, но не доказывает, что правила безопасны.

  2. 02

    Посмотри активную конфигурацию

    nginx -T

    Перед публикацией вывода удали секреты, внутренние адреса и приватные имена.

  3. 03

    Проверь выбор server и location

    Host + URI → ожидаемый блок

    Тестируй известный, неизвестный и граничный Host; exact, prefix и regex пути.

  4. 04

    Проверь приложение напрямую и через proxy

    edge → upstream → app

    Авторизация и права должны проверяться в приложении, а не только по URL в NGINX.

Осторожно с nginx -T. Полный вывод может содержать внутренние адреса и секреты. Редактируй его перед тем, как отправлять кому-либо.

ДАЛЬШЕ / В РАБОТУ

Унеси маршрут
на стенд.

Короткий конспект и редактируемая презентация с конфигурационными примерами.

Сверяйся с первоисточником

Документы,
не догадки.

Описание поведения директив и правил маршрутизации сверено с документацией NGINX и OWASP.

  1. [1]NGINX Beginner’s Guide
  2. [2]How nginx processes a request
  3. [3]NGINX core module: location, root, alias, autoindex
  4. [5]NGINX proxy module
  5. [6]NGINX realip module
  6. [14]OWASP Authorization Cheat Sheet
  7. [16]NGINX server names