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
- Выбор балансировщика: 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 без даунтайма:
# /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 для вашего проекта — оценим текущую схему и предложим оптимальную конфигурацию. Свяжитесь с нами, чтобы обсудить детали.







