У меня есть конфигурация nginx (nginx в 1.17), которая объединяет несколько ресурсов и делает их доступными в одном домене. Одним из этих ресурсов является дистрибутив AWS Cloudfront, подобный следующему:
location / {
# it is required to store the proxy target in a variable in order to
# force DNS re-resolution after the entries' TTL has expired
set $cloudfront_distribution xxxxxxxxxxxxxx.cloudfront.net;
proxy_pass https://$cloudfront_distribution;
proxy_ssl_server_name on;
}
Определение цели прокси, как это работает, как и ожидалось, но требует ручной установки значения resolver
: https://www.nginx.com/blog/dns-service-discovery-nginx-plus/
Как описано в статье, альтернативный подход, который не требует жесткого кодирования решателя (которого я хотел бы избежать, чтобы установка была более переносимым), определяет восходящий поток с одним сервером:
upstream cloudfront {
server xxxxxxxxxxxxxx.cloudfront.net:443;
}
location / {
proxy_pass https://cloudfront;
proxy_ssl_server_name on;
}
Однако при использовании этой настройки выдается сообщение об ошибке, связанное с SNI:
2020/01/06 11:30:53 [error] 6#6: *1 SSL_do_handshake() failed (SSL: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:SSL alert number 40) while SSL handshaking to upstream, client: 172.17.0.1, server: nginx.localhost, request: "GET / HTTP/1.1", upstream: "https://13.35.253.121:443/", host: "nginx.localhost:4000"
, поэтому мне кажется, что nginx и Cloudfront не могут договориться о том, какое имя сервера использовать для сертификата , Затем снова proxy_ssl_server_name
устанавливается на on
, и эта же процедура также работает, когда я определяю имя хоста в блоке местоположения (либо как переменную, как показано в первом примере, либо в жестком коде) вместо восходящего.
Чего-то не хватает в моей конфигурации? Нужно ли добавлять дополнительную информацию в сам апстрим?