Настройка proxy_pass для нескольких серверов: Балансировка нагрузки в Nginx

Что такое proxy_pass и зачем использовать несколько серверов?

Директива proxy_pass в Nginx — ключевой инструмент для перенаправления запросов на backend-серверы. Её использование с несколькими серверами решает критически важные задачи:

  • Масштабируемость: Распределение трафика между серверами позволяет выдерживать высокие нагрузки
  • Отказоустойчивость: При падении одного сервера трафик автоматически перенаправляется на рабочие ноды
  • Геораспределение: Возможность направлять пользователей к ближайшим серверам
  • Гибкость: Легкое добавление/удаление серверов без простоя

Настройка proxy_pass с несколькими серверами в Nginx

Основная конфигурация использует блок upstream:

http {
    upstream backend {
        server 192.168.1.10:80;
        server 192.168.1.11:80;
        server backend-domain.com:8080;
    }
    
    server {
        listen 80;
        location / {
            proxy_pass http://backend;
        }
    }
}

Ключевые параметры:

  1. weight — задает приоритет сервера (по умолчанию 1)
  2. max_fails — количество ошибок для признания сервера недоступным
  3. fail_timeout — время исключения сервера из ротации при ошибках

Методы балансировки нагрузки

Nginx поддерживает несколько алгоритмов распределения запросов:

  • Round Robin (по умолчанию): Циклическое распределение запросов
  • Least Connections: Направление на сервер с минимальным числом активных соединений
  • IP Hash: Привязка клиента к конкретному серверу по хешу IP
  • Weighted Distribution: Ручное назначение весов серверам

Мониторинг здоровья серверов

Для предотвращения перенаправления на нерабочие ноды настройте проверки:

upstream backend {
    server server1.example.com max_fails=3 fail_timeout=30s;
    server server2.example.com max_fails=2 fail_timeout=15s;
    health_check interval=5s;
}

Параметры мониторинга:

  1. interval — частота проверок
  2. fails — количество проваленных проверок для маркировки “unhealthy”
  3. passes — успешные проверки для возврата в ротацию

Продвинутые техники конфигурации

  • Использование DNS-имён с resolver для динамических окружений
  • Настройка таймаутов: proxy_connect_timeout, proxy_read_timeout
  • Кэширование ответов: proxy_cache_path
  • Обработка WebSocket: proxy_http_version 1.1, proxy_set_header Upgrade

Часто задаваемые вопросы (FAQ)

В: Как добавить резервный сервер?

О: Используйте параметр backup:
server backup-server.example.com:80 backup;

В: Почему запросы не распределяются равномерно?

О: Проверьте:

  1. Настройки weight
  2. Работу алгоритма балансировки
  3. Статус серверов в nginx -T

В: Как перенаправлять HTTPS трафик?

О: Добавьте в location:

proxy_ssl_verify off;
proxy_set_header X-Forwarded-Proto https;

В: Можно ли использовать переменные в upstream?

О: Да, с версии Nginx 1.17.0:

map $http_host $backend {
    hostnames;
    default      backend-default;
    example.com  backend-special;
}

В: Как ограничить число соединений с backend?

О: Через параметр max_conns:
server backend1.example.com max_conns=100;

Proxy Ninja
Добавить комментарий