- Что такое proxy_ssl_server_name в Nginx?
- Как работает proxy_ssl_server_name on: технические детали
- Пример конфигурации с proxy_ssl_server_name on
- Когда необходимо включать proxy_ssl_server_name
- Типичные ошибки и решения
- FAQ: Частые вопросы о proxy_ssl_server_name
- Чем отличается proxy_ssl_name от proxy_ssl_server_name?
- Обязательно ли указывать proxy_ssl_name при proxy_ssl_server_name on?
- Работает ли proxy_ssl_server_name с HTTP/2?
- Как проверить, что SNI передаётся корректно?
- Можно ли использовать с самоподписанными сертификатами?
- Заключение
Что такое proxy_ssl_server_name в Nginx?
Директива proxy_ssl_server_name
в Nginx управляет передачей имени сервера (SNI) при проксировании HTTPS-трафика. Когда установлено значение on
, Nginx включает поле Server Name Indication в TLS-рукопожатии, указывая доменное имя целевого сервера. Это критически важно для работы с виртуальными хостами и современными SSL/TLS-конфигурациями, где серверу необходимо знать, какой сертификат представлять клиенту.
Как работает proxy_ssl_server_name on: технические детали
При активации опции происходит следующее:
- Nginx извлекает домен из заголовка
Host
входящего запроса - Добавляет это имя в расширение SNI при установке TLS-соединения с бэкенд-сервером
- Целевой сервер использует SNI для выбора корректного SSL-сертификата
- Шифрованное соединение устанавливается с правильным виртуальным хостом
Без этой директивы бэкенд может получить неверный сертификат или вернуть ошибку SSL_ERROR_UNRECOGNIZED_NAME_ALERT
.
Пример конфигурации с proxy_ssl_server_name on
Рассмотрим практический сценарий проксирования на backend.example.com:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.crt;
ssl_certificate_key /etc/ssl/private/example.key;
location / {
proxy_pass https://backend.example.com;
proxy_ssl_server_name on;
proxy_ssl_name backend.example.com;
proxy_set_header Host $host;
}
}
Ключевые элементы:
proxy_ssl_server_name on
– активирует передачу SNIproxy_ssl_name
– явно задаёт имя сервера для SNIproxy_set_header Host $host
– сохраняет оригинальный заголовок Host
Когда необходимо включать proxy_ssl_server_name
Директива требуется в следующих случаях:
- Проксирование на бэкенды с несколькими SSL-виртуальными хостами
- Использование облачных балансировщиков (AWS ALB, GCP LB)
- Работа с CDN, требующими SNI
- Сертификаты Let’s Encrypt на бэкенд-серверах
- Обход ошибок “SSL handshake failed” при проксировании
Типичные ошибки и решения
Проблемы при настройке и их устранение:
- Ошибка 502 Bad Gateway: Проверьте совпадение имени в
proxy_ssl_name
и действительного домена бэкенда - SSL_ERROR_UNRECOGNIZED_NAME_ALERT: Убедитесь, что на бэкенде установлен сертификат для указанного SNI
- Несовпадение сертификатов: Используйте
proxy_ssl_verify
для проверки цепочки доверия - Устаревшие версии Nginx: Требуется Nginx 1.7.0+ для поддержки SNI
FAQ: Частые вопросы о proxy_ssl_server_name
Чем отличается proxy_ssl_name от proxy_ssl_server_name?
proxy_ssl_name
явно задаёт имя сервера для SNI, тогда как proxy_ssl_server_name
включает механизм передачи. Они используются совместно.
Обязательно ли указывать proxy_ssl_name при proxy_ssl_server_name on?
Нет, если не указан proxy_ssl_name
, Nginx использует домен из proxy_pass
. Но явное указание рекомендуется для избежания неоднозначностей.
Работает ли proxy_ssl_server_name с HTTP/2?
Да, SNI полностью поддерживается в HTTP/2. Директива корректно работает с современными протоколами.
Как проверить, что SNI передаётся корректно?
Используйте команду OpenSSL: openssl s_client -connect backend:443 -servername example.com
. Проверьте поле “Server certificate” в выводе.
Можно ли использовать с самоподписанными сертификатами?
Да, но потребуется дополнительно настроить proxy_ssl_trusted_certificate
для импорта CA.
Заключение
Директива proxy_ssl_server_name on
– мощный инструмент для безопасного проксирования HTTPS-трафика в Nginx. Её правильная настройка обеспечивает корректную работу SNI, предотвращает ошибки SSL и поддерживает современные инфраструктуры с множеством виртуальных хостов. Всегда проверяйте совпадение имён в proxy_ssl_name
и действительных доменов бэкенда, используйте актуальные версии Nginx и тестируйте конфигурацию через OpenSSL перед развёртыванием в production.