Балансировка нагрузки между серверами с помощью Nginx Upstream — это способ распределения входящих запросов между несколькими серверами-бэкендами через единую точку входа. Это позволяет повысить надёжность, масштабируемость и производительность приложения за счёт равномерного распределения трафика и автоматического отключения неработающих серверов из ротации.
Причины необходимости балансировки нагрузки
- Один сервер не может обработать весь входящий трафик без снижения производительности
- Необходимо обеспечить отказоустойчивость: если один сервер выходит из строя, остальные продолжают обслуживать клиентов
- Требуется горизонтальное масштабирование приложения путём добавления новых серверов
- Нужно равномерно распределять нагрузку между инстансами приложения для оптимального использования ресурсов
- Необходимо разделение ответственности: Nginx выступает в роли обратного прокси и диспетчера запросов
Пошаговая инструкция по настройке Nginx Upstream
- Откройте конфигурационный файл Nginx:
sudo nano /etc/nginx/nginx.confили отредактируйте файл конфигурации для конкретного сайта в директории/etc/nginx/sites-available/ - В блоке
http(или выше блокаserver) добавьте секциюupstreamс именем и списком серверов-бэкендов - Укажите IP-адреса и порты бэкенд-серверов в директиве
serverвнутри блокаupstream - В блоке
serverнайдите или создайте блокlocation, который должен использовать балансировку нагрузки - В этом блоке
locationдобавьте директивуproxy_pass http://имя_upstream;, указав имя вашего upstream - Установите дополнительные параметры прокси:
proxy_set_header Host $host;,proxy_set_header X-Real-IP $remote_addr; - Протестируйте синтаксис конфигурации командой
sudo nginx -t - Перезагрузите Nginx:
sudo systemctl reload nginxилиsudo service nginx reload - Проверьте логи 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, так как это перезагружает конфигурацию, не прерывая активные соединения.