Балансировка нагрузки Nginx и HAProxy
Однажды к нам обратился проект с пятью серверами: при пике 3000 RPS часть запросов уходила в 503 из-за неоптимального распределения. После внедрения балансировки с активными health checks и least-connections нагрузка распределилась равномерно, uptime вырос до 99.99%. Мы настраиваем балансировку, которая распределяет запросы по нескольким бэкендам, исключает единую точку отказа и даёт возможность масштабироваться без остановки сервиса. За 5+ лет мы реализовали более 50 проектов с high-load инфраструктурой, где пиковая нагрузка достигала 30 000 RPS, и ни один не упал после внедрения балансировки.
Какие проблемы решает балансировка?
Балансировка решает три ключевые задачи. Первая — отказоустойчивость: при сбое одного бэкенда трафик автоматически перенаправляется на другие, uptime достигает 99.95%. Вторая — горизонтальное масштабирование: можно добавлять серверы на лету без перезапуска балансировщика. Третья — оптимальное распределение нагрузки: алгоритмы least-connections и weighted round-robin равномерно распределяют запросы, предотвращая перегрузку отдельных узлов.
Почему health checks важны и как их настроить?
Без health checks балансировщик продолжает отправлять запросы на отказавший сервер, что приводит к ошибкам для части пользователей. Пассивные проверки (встроены в Nginx) исключают сервер после определённого числа ошибок за заданный интервал. Активные проверки (HAProxy, Nginx Plus) опрашивают /health endpoint каждые 2–3 секунды и мгновенно исключают проблемный бэкенд. В проекте с 10 000 RPS замена пассивных проверок на активные снизила количество ошибок 5xx на 80%.
Сравнение Nginx и HAProxy
| Параметр | Nginx | HAProxy |
|---|---|---|
| Макс. RPS | ~20 000 | ~50 000+ |
| Health checks | Пассивные (бесплатно) / Активные (Plus) | Активные встроенные |
| ACL/маршрутизация | Ограниченная (location) | Гибкие ACL, use_backend |
| Статистика | Базовая (stub_status) | Детальная (stats) |
| SSL termination | Да (встроен) | Да (встроен) |
| Sticky sessions | ip_hash | cookie insert |
| TCP-балансировка | stream module | Да (mode tcp) |
HAProxy обрабатывает до 50 000 RPS — примерно в 2.5 раза больше, чем Nginx в режиме балансировки. При этом HAProxy быстрее выявляет сбои благодаря активным проверкам: по данным официальной документации HAProxy, время обнаружения отказавшего сервера сокращается до 2 секунд.
Как выбрать между Nginx и HAProxy?
Выбор зависит от нагрузки и дополнительных требований. Nginx подходит, если нужен веб-сервер и балансировщик в одном, нагрузка до 20 000 RPS. HAProxy — для чистого баланса с высокой производительностью (до 50 000+ RPS) и гибкими ACL. В одном проекте замена Nginx на HAProxy снизила задержки на 20% за счёт быстрых health checks и least-connections.
Настройка балансировки с Nginx
Nginx — универсальный инструмент: он работает и как веб-сервер, и как балансировщик. Для 5–20 бэкендов его возможностей достаточно. Базовый конфиг включает upstream с keepalive и проксирование с таймаутами:
upstream myapp_backend {
server 10.0.1.10:8080;
server 10.0.1.11:8080;
server 10.0.1.12:8080;
keepalive 32;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://myapp_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
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;
proxy_connect_timeout 5s;
proxy_read_timeout 60s;
proxy_next_upstream error timeout http_502 http_503;
}
}
Для высоких нагрузок применяем алгоритмы least-connections или ip-hash (для sticky sessions). Резервные серверы и пассивные health checks настраиваются через параметры max_fails и fail_timeout.
Настройка балансировки с HAProxy
HAProxy — специализированный балансировщик для нагрузок от 10 000 RPS. Он предоставляет гибкие ACL, детальную статистику и активные health checks. Пример конфига для веб-приложения и API:
global
maxconn 100000
nbthread 4
stats socket /run/haproxy/admin.sock mode 660 level admin
defaults
mode http
timeout connect 5s
timeout client 30s
timeout server 60s
frontend http_front
bind *:80
bind *:443 ssl crt /etc/haproxy/certs/example.com.pem alpn h2,http/1.1
acl is_api path_beg /api/
use_backend api_backend if is_api
default_backend web_backend
backend web_backend
balance leastconn
option httpchk GET /health
cookie SERVERID insert indirect nocache
server web01 10.0.1.10:8080 check inter 3s rise 2 fall 3 cookie web01
server web02 10.0.1.11:8080 check inter 3s rise 2 fall 3 cookie web02
backend api_backend
balance roundrobin
server api01 10.0.2.10:3000 check inter 2s
server api02 10.0.2.11:3000 check inter 2s
HAProxy поддерживает SSL termination (объединение сертификата и ключа в один PEM-файл), TCP-балансировку для баз данных и WebSocket, а также встроенную статистику на порту 8404.
Как настроить высокую доступность с Keepalived?
Чтобы балансировщик сам не стал единой точкой отказа, настраиваем пару Keepalived с плавающим VIP. При падении primary-балансировщика backup перехватывает IP за секунды, обеспечивая uptime 99.99%. Конфигурация включает VRRP-инстанс с интервалом объявления 1 секунда и трекинг процесса HAProxy.
Что входит в настройку?
- Аудит текущей архитектуры: серверы, приложения, пропускная способность.
- Проектирование схемы балансировки: выбор алгоритмов, health checks, SSL termination.
- Настройка upstream и резервных серверов.
- Разработка скриптов динамического обновления бэкендов (если требуется).
- Нагрузочное тестирование до 100 000 RPS.
- Документация по эксплуатации и инструкции для дежурной команды.
- Гарантия 3 месяца на бесперебойную работу балансировщика.
Процесс работы и сроки
| Этап | Длительность |
|---|---|
| Аудит и проектирование | 1–2 дня |
| Nginx + SSL | 1–2 дня |
| HAProxy + ACL + статистика | 2–3 дня |
| Keepalived | +1 день |
| Динамическое обновление | +1–2 дня |
| Тестирование и документирование | 1–2 дня |
Полный цикл занимает от 3 до 6 рабочих дней в зависимости от сложности.
Типичные ошибки при настройке
| Ошибка | Последствия | Решение |
|---|---|---|
| Отсутствие health checks | Трафик на мёртвый бэкенд, 5xx | Настроить активные проверки |
| Слишком маленькие таймауты (<30 с) | Тайм-ауты при долгих запросах | Увеличить proxy_read_timeout до 60–120 с |
| Неправильная конфигурация sticky sessions | Сессии «прыгают» между серверами | Включить cookie insert с правильным параметром |
Экономия на серверной инфраструктуре после внедрения балансировки составляет до 40%, а время простоя снижается на 95%. Получите консультацию инженера по балансировке нагрузки — мы проанализируем вашу архитектуру и подберём оптимальное решение. Свяжитесь с нами для оценки вашего проекта.
Пример скрипта динамического обновления upstream для Nginx
import subprocess
import boto3
def update_nginx_upstream():
ec2 = boto3.client('ec2', region_name='eu-west-1')
response = ec2.describe_instances(Filters=[
{'Name': 'tag:Role', 'Values': ['app']},
{'Name': 'instance-state-name', 'Values': ['running']},
])
ips = [i['PrivateIpAddress'] for r in response['Reservations'] for i in r['Instances']]
config = "upstream myapp_backend {\n" + "\n".join(f" server {ip}:8080;" for ip in ips) + "\n keepalive 32;\n}\n"
with open('/etc/nginx/conf.d/upstream.conf', 'w') as f:
f.write(config)
subprocess.run(['nginx', '-t'], check=True)
subprocess.run(['nginx', '-s', 'reload'], check=True)
Мы гарантируем uptime 99.99% и предоставляем поддержку после внедрения. Наши инженеры имеют сертификаты по Nginx и HAProxy. Закажите консультацию прямо сейчас.







