Прокси-сервер Nginx для AWS ELB не передает протокол HTTPS бэкэнд-инстансам
Это мой первый вопрос, так что, пожалуйста, будьте осторожны со мной!
Я пытаюсь настроить прокси-сервер Nginx для автоматической генерации SSL-сертификатов с использованием OpenResty/Lua и LetsEncrypt в рамках мультитенантной платформы SAAS.
Прокси-сервер работает и сертификаты выдаются нормально. Конфигурация Nginx (через OpenResty) передает запросы на мой AWS Elastic (Classic) Load Balancer.
Проблема в том, что экземпляры моего ELB, похоже, не получают протокол HTTPS, поэтому ссылки в навигации по моим веб-сайтам и т. Д. Все HTTP, а не HTTPS.
Например, загрузка http://www.domain.com работает, но если щелкнуть ссылку в навигации, отобразится http://www.domain.com/page.html.
Вот мой конфиг OpenResty/nginx на прокси:
http {
lua_shared_dict auto_ssl 1m;
lua_shared_dict auto_ssl_settings 64k;
resolver 8.8.8.8 ipv6=off;
init_by_lua_block {
auto_ssl = (require "resty.auto-ssl").new()
auto_ssl:set("allow_domain", function(domain)
return true
end)
auto_ssl:init()
}
init_worker_by_lua_block {
auto_ssl:init_worker()
}
server {
listen 443 ssl;
location / {
proxy_pass http://AWS-ELB-URL-HERE;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
ssl_certificate_by_lua_block {
auto_ssl:ssl_certificate()
}
ssl_certificate /etc/ssl/resty-auto-ssl-fallback.crt;
ssl_certificate_key /etc/ssl/resty-auto-ssl-fallback.key;
}
server {
listen 80;
location /.well-known/acme-challenge/ {
content_by_lua_block {
auto_ssl:challenge_server()
}
}
}
server {
listen 127.0.0.1:8999;
client_body_buffer_size 128k;
client_max_body_size 128k;
location / {
content_by_lua_block {
auto_ssl:hook_server()
}
}
}
}
В попытке попытаться определить, связана ли проблема с моим приложением Rails, я изменил конфигурацию Nginx, чтобы она указывала непосредственно на IP-адрес экземпляра, а не на ELB. При этом все ссылки - https (!), Чего я и хочу!
Таким образом, на данный момент, я считаю, что проблема либо в том, что моя конфигурация Nginx не передает протокол должным образом, либо б) мой ELB не передает протокол в серверный экземпляр.
Я склонен думать, что виновником является ELB, поскольку все работает, как и ожидалось, когда указывает прокси-сервер непосредственно на IP-адрес экземпляра.
Итак, я начал изучать конфигурацию ELB и слушателей, но пока не смог найти работающую конфигурацию. Вот что у меня сейчас:
Я также попытался изменить его на:
Протокол балансировки нагрузки: HTTPS (безопасный HTTP), порт балансировки нагрузки: 443, протокол экземпляра: HTTP, порт экземпляра: 80
Но это тоже не сработало, и ссылки по-прежнему HTTP.
Сейчас я просто гадаю, что делать с прослушивателями и портами, пытаясь понять, какая конфигурация работает, или нет. Пока ничего.
У кого-нибудь есть понимание, в чем может быть проблема и как ее исправить? ТИА!
1 ответ
Хорошо , я понял это! Я только что добавил дополнительную директиву в блок SSL:
proxy_set_header X-Forwarded-Ssl on;
После перезапуска nginx все запросы теперь передаются в виде https моему ELB и серверам приложений за ним!
Кроме того, для моих слушателей ELB я удалил листер SSL (Secure TCP) и добавил:
Протокол LB: HTTPS (безопасный HTTP), порт LB: 443, протокол экземпляра: HTTP, порт экземпляра: 80