Что такое proxy_ssl_server_name в Nginx?
Директива proxy_ssl_server_name
в Nginx играет критическую роль при работе с SSL/TLS-шифрованием в upstream-блоках. Она указывает, должен ли Nginx передавать имя сервера (SNI – Server Name Indication) при проксировании HTTPS-запросов к бэкенд-серверам. По умолчанию (proxy_ssl_server_name off
) Nginx не отправляет SNI, что может вызвать ошибки при работе с виртуальными хостами на бэкенде.
Зачем нужен proxy_ssl_server_name при работе с upstream?
Активация proxy_ssl_server_name on
решает две ключевые проблемы:
- Поддержка виртуальных хостов: Без SNI бэкенд-сервер не может определить, для какого домена запрашивается сертификат.
- Совместимость с современными стандартами: TLS-рукопожатие требует SNI для корректной работы с мультидоменными сертификатами.
- Предотвращение ошибок 502: Отсутствие SNI часто вызывает сбои вида “SSL_do_handshake() failed”.
Как настроить proxy_ssl_server_name для upstream серверов
Базовая конфигурация включает три шага:
- Определите upstream-блок с серверами бэкенда
- В секции
location
включитеproxy_ssl_server_name on
- Убедитесь, что
proxy_ssl_name
соответствует домену сертификата бэкенда
Пример конфигурации Nginx с proxy_ssl_server_name
upstream backend_servers { server 192.168.1.10:443; server 192.168.1.11:443; } server { listen 80; server_name example.com; location / { proxy_pass https://backend_servers; proxy_ssl_server_name on; proxy_ssl_name backend-domain.com; # Домен сертификата бэкенда proxy_ssl_verify on; # Опциональная проверка сертификата } }
Важные нюансы:
- Все upstream-серверы должны использовать одинаковое доменное имя в сертификатах
- Для
proxy_ssl_verify
требуется указатьproxy_ssl_trusted_certificate
- Порт бэкенда должен явно указываться как 443
Типичные ошибки и решения
- Ошибка “certificate doesn’t match”: Проверьте соответствие
proxy_ssl_name
и домена в сертификате бэкенда. - Сбои при балансировке: Убедитесь, что все ноды upstream поддерживают SNI.
- Проблемы с старыми OpenSSL: Обновите Nginx до версии ≥ 1.7.5 (минимальная для поддержки директивы).
FAQ: Часто задаваемые вопросы
Q: Обязательно ли использовать proxy_ssl_server_name для HTTP/2?
A: Да, HTTP/2 требует строгого соответствия SNI и домена в сертификате.
Q: Можно ли использовать разные имена для proxy_ssl_name и server_name?
A: Да, proxy_ssl_name
должен соответствовать домену сертификата бэкенда, а server_name
– публичному домену сайта.
Q: Как проверить, отправляется ли SNI?
A: Используйте openssl s_client -connect backend:443 -servername domain.com
и проверьте поле “Server certificate”.
Q: Работает ли это с самоподписанными сертификатами?
A: Да, но требуется добавить CA в proxy_ssl_trusted_certificate
при включенной проверке.
Q: Что важнее: proxy_ssl_server_name или proxy_ssl_name?
A: proxy_ssl_server_name on
активирует отправку SNI, а proxy_ssl_name
задаёт конкретное значение для отправки.
Заключение
Настройка proxy_ssl_server_name on
критична для безопасного проксирования HTTPS-трафика через Nginx upstream. Она обеспечивает корректное TLS-рукопожатие, предотвращает ошибки 502 и поддерживает современные стандарты шифрования. Всегда проверяйте соответствие доменных имён в proxy_ssl_name
и сертификатах бэкенда, особенно при работе с балансировкой нагрузки и HTTP/2.