Как проверить, что настроенный Nginx правильно проксирует запросы в нужные upstreams?

«Как проверить, что настроенный Nginx правильно проксирует запросы в нужные upstreams?» — вопрос из категории Веб-серверы и балансировка, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps-инфраструктуре Nginx часто выступает как API Gateway или Ingress Controller. Вот как я проверяю его работу с upstreams.

1. Базовая проверка конфигурации

# Проверяем синтаксис конфига
nginx -t

# Если используем динамическую конфигурацию (Consul Template, Ansible), перезагружаем аккуратно
nginx -s reload

2. Проверка доступности upstreams Определяем upstream-блок в конфиге и проверяем его здоровье.

upstream backend {
    server 10.0.1.10:8080 max_fails=3 fail_timeout=30s;
    server 10.0.1.11:8080 max_fails=3 fail_timeout=30s;
    server 10.0.1.12:8080 backup; # Резервный сервер
}

Проверяем статус через специальный endpoint, если включен модуль ngx_http_upstream_module:

curl http://nginx-host/upstream_status

3. Логирование для отладки Добавляем в конфиг Nginx кастомные заголовки и логи.

location /api/ {
    proxy_pass http://backend;
    # Добавляем заголовок с именем выбранного upstream-сервера
    add_header X-Upstream $upstream_addr always;
    # Логируем детали проксирования
    access_log /var/log/nginx/upstream.log upstream_info;
}

log_format upstream_info '$remote_addr - $upstream_addr - $upstream_status - $request_time';

После чего проверяем:

tail -f /var/log/nginx/upstream.log
curl -I http://nginx-host/api/health | grep X-Upstream

4. Использование переменных для проверки балансировки Чтобы убедиться, что балансировка работает (например, round-robin), отправляем несколько запросов:

for i in {1..5}; do curl -s http://nginx-host/api/version | jq .host; done

5. Интеграция с Service Discovery Если upstreams динамические (Kubernetes, Consul), проверяем, что резолвинг работает:

# Для Kubernetes Ingress
kubectl get ingress -n production -o yaml | grep -A5 "backend:"

# Имитируем DNS-резолвинг, который делает Nginx
dig +short backend-service.namespace.svc.cluster.local

6. Проверка health checks Убеждаемся, что Nginx правильно помечает нерабочие ноды. Можно временно остановить один из бэкендов и проверить логи на ошибки 502 или no live upstreams.

Итог: Комбинация проверки конфига, анализа логов, отправки тестовых запросов и мониторинга метрик (вроде nginx_plus_upstream_peer_responses в Prometheus) дает полную картину работы upstreams.