Что такое proxy_ssl_server_name и почему он важен
Директива proxy_ssl_server_name
в Nginx играет критическую роль при работе с SSL/TLS проксированием. Она указывает серверу передавать имя хоста (Server Name Indication или SNI) при установке защищённого соединения с бэкендом. Без корректной настройки SNI современные серверы могут отвергать соединения, вызывая ошибки типа SSL handshake failed. Это особенно актуально для виртуальных хостингов, где одно IP-адрес обслуживает несколько доменов.
Основные причины сбоя proxy_ssl_server_name
- Устаревшая версия Nginx: SNI поддержка требует Nginx 1.7.0 или выше. В более старых сборках директива игнорируется.
- Отсутствие proxy_ssl: Без включённой директивы
proxy_ssl on
параметры SSL/TLS не активируются. - Конфликт с proxy_ssl_name: Одновременное использование
proxy_ssl_name
переопределяет значениеproxy_ssl_server_name
. - Некорректное размещение: Директива должна находиться внутри блока
location
илиserver
, а не в главном конфиге. - Ошибки в DNS: Неразрешимое имя хоста в директиве приводит к сбою TLS-рукопожатия.
Пошаговое решение проблем с proxy_ssl_server_name
- Проверьте версию Nginx: Выполните
nginx -v
. Если версия ниже 1.7.0 – обновите сервер. - Активируйте proxy_ssl: Добавьте
proxy_ssl on;
в конфигурацию блока location. - Уберите конфликтующие директивы: Удалите или закомментируйте
proxy_ssl_name
если используетсяproxy_ssl_server_name
. - Проверьте синтаксис: Убедитесь, что директива указана внутри server/location:
location / {
proxy_pass https://backend;
proxy_ssl_server_name on;
} - Тестируйте DNS: Используйте
nslookup your-backend.com
для проверки разрешения имени. - Анализируйте логи: Ищите ошибки SSL в
/var/log/nginx/error.log
(например, “SSL_do_handshake() failed”).
Рабочие примеры конфигурации Nginx
Базовая настройка для HTTPS-прокси:
server { listen 443 ssl; server_name example.com; location / { proxy_pass https://backend-service; proxy_ssl_server_name on; proxy_ssl on; proxy_ssl_protocols TLSv1.2 TLSv1.3; proxy_ssl_verify off; # Для тестов, в продакшене используйте валидацию } }
Важно: Всегда включайте proxy_ssl_verify
в рабочих средах с корректными сертификатами.
FAQ: Частые вопросы о proxy_ssl_server_name
Q: В чём разница между proxy_ssl_name и proxy_ssl_server_name?
A: proxy_ssl_name
явно задаёт имя хоста для SNI, тогда как proxy_ssl_server_name
включает автоматическую передачу имени из proxy_pass
.
Q: Почему SNI не передаётся, хотя директива включена?
A: Проверьте версию OpenSSL на сервере (требуется 0.9.8f+). Используйте openssl version
. Также убедитесь, что бэкенд принимает SNI.
Q: Как проверить, что SNI работает?
A: Используйте Wireshark или команду: openssl s_client -connect backend:443 -servername your.domain
. Ищите строку “TLS server name” в выводе.
Q: Может ли проблема быть в бэкенде, а не в Nginx?
A: Да. Если бэкенд использует устаревшее ПО (например, старые версии Apache без SNI), соединение будет падать. Тестируйте прямое подключение к бэкенду.
Q: Обязательно ли отключать proxy_ssl_verify?
A: Нет! Отключайте (off
) только для диагностики. В продакшене всегда включайте проверку и укажите proxy_ssl_trusted_certificate
.