Что такое proxy_ssl_server_name в Nginx Ingress?
Директива proxy_ssl_server_name
— критически важный параметр конфигурации Nginx Ingress Controller, управляющий передачей SNI (Server Name Indication) при проксировании TLS-трафика. Когда Ingress перенаправляет зашифрованные HTTPS-запросы к бэкенд-сервисам, эта директива определяет, будет ли имя сервера из оригинального запроса клиента включено в TLS-рукопожатие с целевым POD. По умолчанию отключена (off
), что вызывает проблемы при работе с сертификатами для нескольких доменов.
Как работает SNI и зачем нужен proxy_ssl_server_name
SNI — расширение TLS-протокола, позволяющее серверу предъявлять корректный SSL-сертификат для разных доменов на одном IP-адресе. Без активации proxy_ssl_server_name
:
- Nginx не передаёт доменное имя клиента бэкенду
- Серверы с мультидоменными сертификатами возвращают ошибки SSL
- Возникают сбои вида
SSL_ERROR_NO_CYPHER_OVERLAP
в браузерах
Активация директивы решает эти проблемы, добавляя заголовок Server Name
в TLS-клиент бэкенда.
Пошаговая настройка proxy_ssl_server_name в Kubernetes
Для включения через ConfigMap Nginx Ingress Controller:
- Создайте или отредактируйте ConfigMap:
apiVersion: v1 kind: ConfigMap metadata: name: nginx-configuration namespace: ingress-nginx data: proxy-ssl-server-name: "on"
- Примените изменения:
kubectl apply -f configmap.yaml
- Проверьте логи Ingress Controller:
kubectl logs -n ingress-nginx [pod-name] | grep proxy_ssl_server_name
Для аннотации в конкретном Ingress-ресурсе:nginx.ingress.kubernetes.io/proxy-ssl-server-name: "on"
Типичные ошибки и решения
- Ошибка 502 Bad Gateway: Проверьте синтаксис ConfigMap и перезапустите POD
- Сертификат не соответствует домену: Убедитесь, что бэкенд поддерживает SNI
- Конфликт с proxy_ssl_name: Не используйте обе директивы одновременно
- Устаревшая версия Ingress Controller: Обновите до актуальной версии (v1.0+)
Оптимизация производительности и безопасности
При активации proxy_ssl_server_name
:
- Добавьте
proxy_ssl_verify on
для проверки сертификатов бэкенда - Настройте
proxy_ssl_trusted_certificate
с цепочкой CA - Ограничьте TLS-версии:
proxy_ssl_protocols TLSv1.2 TLSv1.3
- Мониторьте нагрузку CPU — SNI добавляет 5-7% overhead
FAQ: Часто задаваемые вопросы
Вопрос: Отличается ли proxy_ssl_server_name от proxy_ssl_name?
Ответ: Да. proxy_ssl_name
жёстко задаёт домен в TLS-рукопожатии, тогда как proxy_ssl_server_name
динамически передаёт имя из запроса клиента.
Вопрос: Работает ли с самоподписанными сертификатами?
Ответ: Да, но требуется добавить CA в proxy_ssl_trusted_certificate
и включить proxy_ssl_verify
.
Вопрос: Как проверить, что SNI передаётся корректно?
Ответ: Используйте openssl s_client -connect [адрес]:443 -servername example.com
и проверьте поле SSL-Session:
в выводе.
Вопрос: Обязательно ли включать директиву для HTTP/2?
Ответ: Да, HTTP/2 требует корректной работы SNI для мультидоменных конфигураций.
Вопрос: Влияет ли на скорость обработки запросов?
Ответ: Минимальное влияние (до 7% на TLS-рукопожатии), компенсируется кэшированием сессий через proxy_ssl_session_reuse
.