HTTPS-трафік зростає, а бекенди задихаються від TLS handshake. Кожен новий запит потребує асиметричного шифрування — при 10 000 RPS CPU йде в 90% завантаження. Замість того, щоб кожен upstream-сервер витрачав ресурси, ми виносимо SSL termination на балансувальник. Це стандартна практика, описана в Wikipedia. Налаштовуємо так, щоб сертифікати оновлювалися без даунтайму, а клієнти не бачили помилок.
Чому SSL termination знижує навантаження на бекенди?
SSL handshake потребує дорогих асиметричних операцій. Якщо кожен бекенд обробляє його самостійно, CPU йде в перевантаження вже при 10 тис. RPS. Винос на балансувальник знижує навантаження на 60–80% та спрощує управління сертифікатами: один домен — один сертифікат, а не копії на кожному інстансі. Балансувальник бере на себе всі операції шифрування, а бекенди працюють по HTTP, що додатково прискорює відповідь. Економія CPU при SSL termination особливо помітна на високих навантаженнях.
Які проблеми вирішує SSL termination?
Найчастіша проблема — неповний ланцюжок сертифікатів. Балансувальник віддає тільки leaf-сертифікат без intermediate CA. Браузер довіряє, curl мовчить, але openssl s_client -connect example.com:443 -showcerts показує Verify return code 21 — unable to verify the first certificate. Мобільні клієнти та старі JDK падають з 'PKIX path building failed'.
Другий біль — автоматичне оновлення Let's Encrypt. Certbot оновив сертифікат, а HAProxy не перечитав його без рестарту — о 3 ночі сайт іде на expired cert. Вирішуємо це через Runtime API або сигнали reload без втрати з'єднань.
Перевірка ланцюжка сертифікатів
Для діагностики використовуйте командуopenssl s_client -connect example.com:443 -showcerts. Якщо код повернення 21, об'єднайте fullchain.pem, intermediate та root сертифікати в один файл. Перевірка через SSL Labs дасть рейтинг A+.
Як ми налаштовували SSL termination для фінтех-кластера
Нещодавно налаштували HAProxy cluster для фінтех-компанії: 20 доменів, zero-downtime оновлення через Runtime API. До цього кожен бекенд обробляв SSL самостійно — при навантаженні 15 тис. RPS CPU був завантажений на 90%. Після винесення termination на балансувальник навантаження впало до 25%, а рейтинг SSL Labs досяг A+. На відміну від nginx, HAProxy дозволяє оновлювати сертифікати без рестарту. Сертифікати оновлюються автоматично через deploy-hook без жодного даунтайму за півроку експлуатації. Як сказано в документації HAProxy: Runtime API дозволяє оновлювати сертифікати без перезавантаження процесу. Ми — команда DevOps з 7-річним досвідом, виконали понад 50 проектів з SSL termination.
Покрокове налаштування SSL termination
- Вибір балансувальника: nginx для простих проектів (1–10 доменів), HAProxy для кластерів з zero-downtime.
- Генерація сертифіката: отримуємо fullchain.pem та privkey.pem від Let's Encrypt або комерційного CA.
- Налаштування конфігурації: вказуємо ssl_certificate, ssl_certificate_key, обмежуємо протоколи (TLSv1.2+TLSv1.3) та шифри (ECDHE+AES-GCM).
- Тестування: перевіряємо ланцюжок, HSTS заголовок, X-Forwarded-Proto через testssl.sh та Security Headers Score.
- Автооновлення: налаштовуємо deploy-hook для оновлення сертифіката без даунтайму.
Конфігурація nginx з SSL termination
upstream backend {
server 10.0.1.10:8080;
server 10.0.1.11:8080;
keepalive 32;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.fullchain.pem;
ssl_certificate_key /etc/ssl/private/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
add_header Strict-Transport-Security "max-age=63072000" always;
location / {
proxy_pass http://backend;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}Заголовок X-Forwarded-Proto: https критично важливий — без нього застосунок думає, що отримує HTTP-запит і генерує посилання на http://, ламаючи редиректи та Mixed Content.
HAProxy з автоматичним оновленням cert
HAProxy починаючи з версії 2.2 вміє перезавантажувати сертифікати без рестарту через Runtime API:
echo "set ssl cert /etc/haproxy/certs/example.com.pem < /etc/haproxy/certs/example.com.new.pem" \
| socat stdio /run/haproxy/admin.sock
echo "commit ssl cert /etc/haproxy/certs/example.com.pem" \
| socat stdio /run/haproxy/admin.sockЦе дозволяє інтегрувати Certbot deploy-hook без даунтайму. Для цього використовуйте letsencrypt haproxy deploy-hook:
# /etc/letsencrypt/renewal-hooks/deploy/haproxy-reload.sh
cat /etc/letsencrypt/live/example.com/fullchain.pem \
/etc/letsencrypt/live/example.com/privkey.pem \
> /etc/haproxy/certs/example.com.pem
echo "set ssl cert /etc/haproxy/certs/example.com.pem < /etc/haproxy/certs/example.com.pem" \
| socat stdio /run/haproxy/admin.sock
echo "commit ssl cert /etc/haproxy/certs/example.com.pem" \
| socat stdio /run/haproxy/admin.sock
Як вибрати між nginx та HAProxy?
При виборі балансувальника враховуйте складність: HAProxy обробляє до 1 млн handshake/s — це в 1.2 рази швидше за nginx на слабкому CPU.
| Параметр | nginx | HAProxy |
|---|---|---|
| Простота конфігурації | Висока | Середня |
| Динамічне оновлення сертифікатів | Потребує reload (graceful) | Runtime API (без втрат) |
| Продуктивність TLS | ~90% від HAProxy | Еталон (до 1 млн handshake/s) |
| Мультидоменність | Через server_name | Через SNI (потрібне налаштування) |
Якщо у вас 1–10 доменів і ви хочете швидко — беріть nginx. Якщо кластер на 100+ доменів і критичний zero-downtime — HAProxy.
Типові помилки та як їх уникнути
- Неповний ланцюжок сертифікатів перевірка: використовуйте
openssl s_client -showcerts. Якщо код 21 — об'єднайте fullchain + int + root. - HTTP→HTTPS редирект без HSTS: зловмисник може провести downgrade атаку. Додайте
add_header Strict-Transport-Security. - Пропущений X-Forwarded-Proto: додаток генерує http-посилання. Завжди пробрасуйте протокол.
- Ручне оновлення сертифікатів: налаштуйте deploy-hook одразу, щоб не забути.
- Відсутність перевірки SSL Labs після деплою: мета — рейтинг A+.
Процес роботи та терміни
| Етап | Тривалість |
|---|---|
| Аудит та збір вимог | 2–4 години |
| Проектування схеми | 1–2 години |
| Реалізація на staging | 4–8 годин |
| Тестування (SSL Labs, curl, автооновлення) | 2–4 години |
| Деплой на production | 1–2 години |
| Масштаб | Термін |
|---|---|
| Один балансувальник, один домен | 4–8 годин |
| Кілька доменів, wildcard | 1 день |
| HAProxy/nginx cluster + автооновлення | 1–2 дні |
Що входить до налаштування
- Аудит поточної схеми балансування та сертифікатів
- Проектування оптимальної конфігурації (nginx/HAProxy, вибір протоколів)
- Налаштування SSL termination з тестуванням ланцюжка
- Інтеграція автооновлення Let's Encrypt через deploy-hook
- Перевірка безпеки: HSTS заголовок, X-Forwarded-Proto, Security Headers
- Документація та інструкції для команди
- Навчання чергових інженерів
- Гарантійна підтримка 2 тижні
Отримайте консультацію з SSL termination налаштування для вашого проекту — оцінимо поточну схему та запропонуємо оптимальну конфігурацію. Зв'яжіться з нами, щоб обговорити деталі.







