Что такое 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.








