Балансування навантаження 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. Замовте консультацію прямо зараз.







