Продуктивність без компромісів: SSL termination на балансувальнику

Ваші бекенд-сервери витрачають цінні ресурси на шифрування кожного HTTPS-запиту, що сповільнює роботу та збільшує навантаження на CPU. Ми виносимо SSL termination на балансирувальник, звільняючи сервери для основної роботи. Наша команда реалізує проєкт під ключ — від налаштування до автоматичного оновлення сертифікатів, забезпечуючи стабільну роботу та подальшу підтримку.
Часті запитання

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

  1. Вибір балансувальника: nginx для простих проектів (1–10 доменів), HAProxy для кластерів з zero-downtime.
  2. Генерація сертифіката: отримуємо fullchain.pem та privkey.pem від Let's Encrypt або комерційного CA.
  3. Налаштування конфігурації: вказуємо ssl_certificate, ssl_certificate_key, обмежуємо протоколи (TLSv1.2+TLSv1.3) та шифри (ECDHE+AES-GCM).
  4. Тестування: перевіряємо ланцюжок, HSTS заголовок, X-Forwarded-Proto через testssl.sh та Security Headers Score.
  5. Автооновлення: налаштовуємо 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 налаштування для вашого проекту — оцінимо поточну схему та запропонуємо оптимальну конфігурацію. Зв'яжіться з нами, щоб обговорити деталі.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1141