Балансировка нагрузки между серверами с помощью Nginx Upstream

Как настроить балансировку нагрузки между серверами с помощью Nginx Upstream

Балансировка нагрузки между серверами с помощью Nginx Upstream — это способ распределения входящих запросов между несколькими серверами-бэкендами через единую точку входа. Это позволяет повысить надёжность, масштабируемость и производительность приложения за счёт равномерного распределения трафика и автоматического отключения неработающих серверов из ротации.

Причины необходимости балансировки нагрузки

  • Один сервер не может обработать весь входящий трафик без снижения производительности
  • Необходимо обеспечить отказоустойчивость: если один сервер выходит из строя, остальные продолжают обслуживать клиентов
  • Требуется горизонтальное масштабирование приложения путём добавления новых серверов
  • Нужно равномерно распределять нагрузку между инстансами приложения для оптимального использования ресурсов
  • Необходимо разделение ответственности: Nginx выступает в роли обратного прокси и диспетчера запросов

Пошаговая инструкция по настройке Nginx Upstream

  1. Откройте конфигурационный файл Nginx: sudo nano /etc/nginx/nginx.conf или отредактируйте файл конфигурации для конкретного сайта в директории /etc/nginx/sites-available/
  2. В блоке http (или выше блока server) добавьте секцию upstream с именем и списком серверов-бэкендов
  3. Укажите IP-адреса и порты бэкенд-серверов в директиве server внутри блока upstream
  4. В блоке server найдите или создайте блок location, который должен использовать балансировку нагрузки
  5. В этом блоке location добавьте директиву proxy_pass http://имя_upstream;, указав имя вашего upstream
  6. Установите дополнительные параметры прокси: proxy_set_header Host $host;, proxy_set_header X-Real-IP $remote_addr;
  7. Протестируйте синтаксис конфигурации командой sudo nginx -t
  8. Перезагрузите Nginx: sudo systemctl reload nginx или sudo service nginx reload
  9. Проверьте логи Nginx: tail -f /var/log/nginx/access.log, чтобы убедиться, что запросы распределяются между серверами

Пример базовой конфигурации

Вот базовый пример файла конфигурации Nginx с использованием upstream:

upstream backend_servers {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

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

  • Round Robin (по умолчанию) — запросы распределяются поочередно между серверами в циклическом порядке
  • Least Connections — запросы отправляются на сервер с наименьшим количеством активных соединений; используйте директиву least_conn; в блоке upstream
  • IP Hash — сервер выбирается на основе хеша IP-адреса клиента, что обеспечивает привязку к одному серверу; используйте ip_hash;
  • Weight (вес) — назначьте серверам разные веса для неравномерного распределения; указывается как server 192.168.1.10:8080 weight=3;
  • Random — выбор сервера в случайном порядке; используйте random; в блоке upstream

Пример конфигурации с различными методами балансировки

upstream backend_weighted {
    server 192.168.1.10:8080 weight=5;
    server 192.168.1.11:8080 weight=2;
    server 192.168.1.12:8080 weight=1;
}

upstream backend_least_conn {
    least_conn;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

upstream backend_ip_hash {
    ip_hash;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

Отказоустойчивость и проверка здоровья серверов

Nginx позволяет настроить автоматическое исключение неработающих серверов из ротации. Для использования более продвинутых проверок здоровья требуется Nginx Plus, но базовые параметры доступны:

  • Параметр max_fails=3 — количество неудачных попыток соединения перед отключением сервера
  • Параметр fail_timeout=30s — время, на которое сервер исключается из ротации после достижения лимита ошибок
  • Параметр backup — сервер используется только если все основные серверы недоступны
  • Параметр down — постоянно отключает сервер из ротации без удаления из конфигурации
upstream backend_reliable {
    server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.12:8080 backup;
}

Важные параметры прокси

  • proxy_connect_timeout — таймаут подключения к бэкенд-серверу (по умолчанию 60 сек)
  • proxy_send_timeout — таймаут отправки запроса на бэкенд-сервер (по умолчанию 60 сек)
  • proxy_read_timeout — таймаут получения ответа от бэкенд-сервера (по умолчанию 60 сек)
  • proxy_buffering — буферизация ответов от бэкенда; установите off для потоковых данных
  • proxy_cache — кеширование ответов от бэкенда для снижения нагрузки
location / {
    proxy_pass http://backend_servers;
    proxy_connect_timeout 10s;
    proxy_send_timeout 30s;
    proxy_read_timeout 30s;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

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

Как убедиться, что балансировка работает и запросы распределяются равномерно? Проверьте логи доступа на каждом бэкенд-сервере (tail -f /var/log/nginx/access.log) и убедитесь, что каждый сервер получает примерно одинаковое количество запросов, или используйте команду sudo nginx -s reload и мониторьте метрики через инструменты наблюдения.

Почему запросы от одного клиента идут на разные серверы? Это происходит, если используется метод балансировки Round Robin, который не привязывает клиента к одному серверу; используйте ip_hash, если нужна привязка к одному бэкенду.

Как перезагрузить конфигурацию Nginx без потери текущих соединений? Используйте команду sudo nginx -s reload или sudo systemctl reload nginx вместо restart, так как это перезагружает конфигурацию, не прерывая активные соединения.

Похожие материалы

Скорость дисковой подсистемы сервера утилитой dd в консоли
DHCP сервер на базе Windows Server 2022
Роль контроллера домена Active Directory в Windows Server