Разгрузка CPU и автообновление: выносим 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+. Сертификаты обновляются автоматически через deploy-hook без единого даунтайма за полгода эксплуатации. Как сказано в документации HAProxy: Runtime API позволяет обновлять сертификаты без перезагрузки процесса.

Пошаговая настройка 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 без даунтайма:

# /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
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1140