Диагностика проблем маршрутизации: инструменты и методы для DevOps и сисадминов | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

Диагностика проблем маршрутизации: инструменты и методы для DevOps и сисадминов

12 июня 2026 7 мин. чтения

Ошибка маршрутизации в веб-приложении или микросервисной архитектуре - это ситуация, когда запрос пользователя не достигает нужного обработчика или делает это неправильно. Результатом становятся 404 Not Found, зацикливания редиректов, некорректная балансировка нагрузки и необъяснимые задержки. Время на поиск причины может растянуться на часы. Эта статья предлагает системный подход к диагностике, который сокращает это время до минут. Методика строится на трёх уровнях: быстрая проверка клиентской стороны с curl, углублённый анализ логов сервера (Nginx/Apache) и трассировка запросов в распределённых системах (Istio, Kiali, Jaeger). Вы получите конкретные команды и алгоритмы действий для каждого этапа.

С чего начать: быстрая диагностика клиентской стороны с curl

Когда пользователь сообщает об ошибке, первым шагом должно быть воспроизведение проблемы извне, с точки зрения клиента. Инструмент curl в этом незаменим. Он позволяет увидеть полный цикл HTTP-запроса, минуя сложности браузера или кода приложения. Это базовый навык, который экономит время на первичную локализацию проблемы.

Ключ -v: ваш главный инструмент для анализа полного цикла запроса

Команда curl -v https://api.example.com/resource выводит детальную информацию. Вывод разделён на три части, обозначенные символами:

  • * (звёздочка): Информация о соединении (DNS, TCP-handshake, TLS).
  • > (больше): Исходящие заголовки HTTP-запроса.
  • < (меньше): Входящие заголовки HTTP-ответа от сервера.

Для диагностики 404 ошибки обратите внимание на фактические URL в строках > GET и < Location. Частая причина - неучтённый редирект, изменяющий путь. Пример: вы запрашиваете /api/v1/users, но сервер отвечает статусом 301 и заголовком Location: /v1/users (без /api). В выводе curl вы увидите две строки > GET: первую для исходного запроса, вторую - для автоматического follow-up запроса после редиректа. Сравните их.

Зацикливание редиректов (redirect loop) диагностируется по повторяющимся одинаковым заголовкам < Location: в выводе. Curl по умолчанию следует за редиректами до 50 раз, после чего остановится с ошибкой. Ключ -v покажет каждую итерацию. Важно проверять финальный статус-код после всех редиректов: он указан в последней строке < HTTP/2.

curl -v https://example.com/old-path
...
< HTTP/2 301
< Location: /new-path
...
> GET /new-path HTTP/2
< HTTP/2 301
< Location: /old-path
...
curl: (47) Maximum (50) redirects followed

Моделирование сложных сценариев: заголовки (-H) и cookies

Разница в поведении между curl и браузером часто вызвана отсутствием нужных заголовков. Ключ -H позволяет их добавить.

  • Заголовок Host: Критически важен для виртуальных хостов и ingress-контроллеров. curl -H "Host: api.staging.example.com" http://10.0.0.1 имитирует запрос к staging-окружению.
  • Заголовки балансировки нагрузки: Для проверки корректности передачи IP-адреса клиента используйте X-Forwarded-For или X-Real-IP. curl -H "X-Forwarded-For: 203.0.113.5" .... Затем проверьте логи бэкенда, чтобы убедиться, что заголовок дошёл.
  • Имитация AJAX-запросов: Некоторые серверные правила срабатывают только для AJAX. Добавьте curl -H "X-Requested-With: XMLHttpRequest".
  • Работа с аутентификацией: Передайте cookie из браузера: curl -H "Cookie: session=abc123". Или отправьте Bearer Token: curl -H "Authorization: Bearer <JWT>". Это помогает отладить проблемы с 401/403 ошибками, которые подробно разбираются в отдельном руководстве по ошибкам авторизации.

Глубокая проверка на стороне сервера: анализ логов Nginx и Apache

Если curl подтвердил, что запрос доходит до сервера, но результат неверный, диагностика перемещается на уровень веб-сервера. Логи показывают внутреннюю обработку: в какой location попал запрос, на какой бэкенд он был передан и почему upstream вернул ошибку.

Чтение логов Nginx: от location-блоков до upstream-серверов

Стандартный access_log в Nginx содержит ключевые для маршрутизации поля. Настройте детальный формат в конфигурации:

log_format debug_format '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for" '
                       'upstream: $upstream_addr $request_time';
access_log /var/log/nginx/access.log debug_format;

Поле $upstream_addr показывает IP-адрес и порт бэкенда, на который был проксирован запрос. Если вы видите upstream: 10.2.3.4:8080, но ожидали другой адрес - проблема в конфигурации upstream или health-check.

Для диагностики 404 анализируйте $request (например, GET /api/v2/users HTTP/1.1) и сопоставляйте его с location-блоками в конфиге Nginx. Ошибка часто возникает из-за опечатки в регулярном выражении location. error_log уровня warn или debug может содержать сообщения о том, почему запрос не попал в ожидаемый location.

Ошибки 502 (Bad Gateway) и 504 (Gateway Timeout) требуют изучения error_log. Ищите строки типа upstream timed out (110: Connection timed out) или connect() failed (111: Connection refused). Они указывают на недоступность или слишком долгий ответ от бэкенда. Для комплексного анализа логов, включая поиск медленных запросов и паттернов атак, используйте готовые команды grep и awk из нашего руководства.

Диагностика в Apache: модули mod_proxy и mod_rewrite

В Apache ключевыми для маршрутизации являются модули mod_proxy и mod_rewrite. Включите детальное логирование для них в конфигурации виртуального хоста:

LogLevel debug proxy:t rewrite:t

В логах (обычно error.log) появятся сообщения о применении правил RewriteRule и прокси-пассах через ProxyPass. Это позволяет отследить цепочку преобразований URL. Типичная проблема - зацикливание из-за условия RewriteCond, которое не предотвращает повторное применение правила к уже переписанному URL. В логе вы увидите многократное срабатывание одного и того же правила.

Для анализа того, на какой хост и порт в итоге ушёл запрос, настройте CustomLog с переменной %{Host}i или используйте заголовки, которые добавляет mod_proxy. Проблемы с сетевым уровнем, такие как обрыв соединения до upstream или неправильные маршруты на уровне ОС, могут потребовать отдельной диагностики с помощью инструментов вроде traceroute и mtr.

Трассировка запросов в распределенных системах: Istio, Kiali и Jaeger

В микросервисной архитектуре на Kubernetes с Istio запрос проходит через множество сервисов. Когда он теряется или замедляется, логи отдельных компонентов недостаточны. Необходима сквозная трассировка (distributed tracing).

Kiali: карта сервисов и мгновенное выявление проблемных маршрутов

Kiali визуализирует граф взаимодействий между сервисами в виде диаграммы. После открытия интерфейса обратите внимание на:

  • Цвет узлов (сервисов) и рёбер (связей): Зелёный обычно означает успешные запросы, красный - наличие ошибок (например, HTTP 5xx).
  • Толщина рёбер: Пропорциональна трафику (RPS - requests per second).
  • Метки на рёбрах: Показывают процент ошибок и задержку (p95, p99).

Если на графе вы видите красное ребро от сервиса A к сервису B, проблема локализована. Используйте фильтры в левой панели, чтобы изолировать конкретный namespace или workload. Перейдите на вкладку "Traces" для выбранного ребра - там отобразятся примеры неудачных запросов. Это отправная точка для глубокого анализа в Jaeger.

Jaeger: детальный разбор трейса для точечной диагностики

Jaeger хранит детальные трейсы - цепочки спанов (spans), каждый из которых соответствует операции в одном сервисе. Чтобы найти проблемный трейс:

  1. В интерфейсе Jaeger выберите сервис-источник проблемы из выпадающего списка.
  2. В фильтрах укажите тег error=true или конкретный статус-код: http.status_code=500.
  3. Задайте временной интервал и нажмите "Find Traces".

Открыв трейс, вы увидите дерево спанов на временной шкале. Анализируйте:

  • Длительность каждого спана: Самый длинный span указывает на узкое место.
  • Теги внутри спана: Разверните span, чтобы увидеть детали: http.url, http.method, http.status_code, а также логи (если они были инжектированы).
  • Ошибки: Span с ошибкой будет помечен красным значком. В его тегах часто содержится текст ошибки из stdout/stderr контейнера.

Пример кейса: Пользователь получает 500 ошибку от API-гейтвея. В Jaeger вы находите трейс, где span от гейтвея завершился успешно, но span от внутреннего сервиса «order-service» содержит тег http.status_code=404 и в логах сообщение "Route not found to payment-service". Причина - ошибка в конфигурации Istio ServiceEntry или DestinationRule для «payment-service», из-за которой «order-service» не может разрешить его DNS-имя. Диагностика таких сложных зависимостей в Kubernetes часто требует глубокой отладки Custom Resources.

Сборник практических кейсов: от симптома к решению

Следующая таблица обобщает методику и предоставляет готовый алгоритм действий для распространённых симптомов.

Симптом Алгоритм диагностики Инструменты и что проверять
404 Not Found 1. Проверить фактический URL и редиректы с помощью curl -v.
2. Найти запрос в access_log сервера, сверить $request.
3. Проверить конфигурацию location/upstream (Nginx) или VirtualHost/ProxyPass (Apache).
4. Для микросервисов - найти трейс в Jaeger, посмотреть http.url в спане проблемного сервиса.
curl, Nginx/Apache логи, конфигурационные файлы, Jaeger.
Redirect Loop (зацикливание) 1. Анализ цепочки заголовков Location: в выводе curl -v.
2. Проверить правила редиректа (rewrite, return) в конфигах веб-сервера.
3. Исключить влияние кэширования (браузер, CDN).
curl, Nginx (rewrite), Apache (RewriteRule).
Некорректная балансировка в Kubernetes 1. Открыть граф сервисов в Kiali, найти аномалии в рёбрах.
2. В Jaeger сравнить трейсы нескольких запросов: проверять поле peer.address или upstream_cluster в спанах, чтобы увидеть, на какие pod'ы идут запросы.
3. Проверить конфигурацию Kubernetes Service (селекторы) и Istio DestinationRule (subset, loadBalancer).
Kiali, Jaeger, kubectl get endpoints, Istio CRDs.
Высокая задержка от микросервиса 1. В Jaeger найти трейсы с большой общей длительностью.
2. На временной шкале трейса идентифицировать span с наибольшей длительностью.
3. Изучить теги и логи этого спана: медленный SQL-запрос, внешний API-вызов, блокировка (lock).
4. Перейти к мониторингу этого сервиса (метрики CPU, БД).
Jaeger, логи приложения, Prometheus/Grafana.

Этот системный подход позволяет последовательно исключать слои сложности: от сетевого уровня до бизнес-логики. Для поддержания здоровья всей инфраструктуры также полезно проводить регулярный комплексный аудит безопасности, который включает проверку конфигураций маршрутизации и сетевых политик. Интеграция с инструментами ИИ, такими как AiTunnel, может автоматизировать анализ логов и метрик, предлагая гипотезы о причинах инцидентов на основе исторических данных.

Поделиться:
Сохранить гайд? В закладки браузера