Прежде чем читать дальше, я попытался понять / найти решение. Из подобных вопросов я не нашел ответа или хотя бы понял, что делаю не так.
Итак, у меня есть 2 экземпляра Amazon EC2 и балансировщик нагрузки ELB.
Для каждого экземпляра я использую NGINX с Gunicorn и Django.
Я настраиваю перенаправление для всех HTTP-запросов на HTTPS. Но по необъяснимым причинам перенаправления не работают.
Я попытался изменить свой файл hosts, чтобы я мог напрямую подключиться к одному из экземпляров, и перенаправление работает. Но когда я использую ELB, он не работает.
Вот пример конфигурации nginx:
upstream myserver {
server 127.0.0.1:10032 fail_timeout=0;
}
server {
listen 80;
server_name pub.myserver.ca;
return 301 https://$server_name$request_uri;
}
server {
listen 443;
server_name pub.myserver.ca;
ssl on;
ssl_certificate /etc/ssl/pub_myserver_ca.pem;
ssl_certificate_key /etc/ssl/pub_myserver_ca.key;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
access_log /var/log/nginx/myserver-access.log;
error_log /var/log/nginx/myserver-error.log;
keepalive_timeout 300;
proxy_read_timeout 300;
client_max_body_size 200M;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://myserver;
break;
}
}
location /static {
autoindex off;
alias /home/tool/www/static;
}
}
У тебя есть идеи? Или понимание? Или документацию, которую я должен изучить?
Заранее спасибо.
РЕДАКТИРОВАТЬ
cUrl ответ, когда запрос проходит через ELB:
$ curl -I http://pub.myserver.ca/client/sign-in/
HTTP/1.1 200 OK
Content-Language: en
Content-Type: text/html; charset=utf-8
Date: Tue, 23 May 2017 20:39:34 GMT
Server: nginx
Set-Cookie: csrftoken=********; expires=Tue, 22-May-2018 20:39:34 GMT; Max-Age=31449600; Path=/
Set-Cookie: sessionid=********; expires=Tue, 06-Jun-2017 20:39:34 GMT; httponly; Max-Age=1209600; Path=/
Vary: Accept-Language, Cookie
X-Frame-Options: SAMEORIGIN
Connection: keep-alive
cUrl ответ, когда запрос идет напрямую на сервер:
$ curl -I http://pub.myserver.ca/client/sign-in/
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Tue, 23 May 2017 20:40:18 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: https://pub.myserver.ca/client/sign-in/
Конфигурация ELB:
Спасибо @ Michael-sqlbot, который помог мне решить мою проблему, заключающуюся в перенаправлении пользователей с HTTP на HTTPS.
Решением было изменить слушателя в конфигурации ELB: я заменил 80 >> 443
по 80 >> 80
Также спасибо @Tim, который нашел время, чтобы помочь мне.
Ваш ELB настроен на прием запросов от клиента по http или https, но все запросы передаются экземплярам по https. Вот почему запросы через ELB не получают перенаправления 301, ELB уже сделал это за вас.
Когда вы делаете http-запрос к экземпляру напрямую, ELB нет, поэтому вы получаете перенаправление 301.
Я подозреваю, что файлы cookie добавляются приложением, а не ELB. Если вы сделаете https-запрос непосредственно к экземпляру, вы можете это подтвердить. Я считаю, что часть «httponly» связана с тем, что Nginx проксирует https-запрос на http-сервер, который не знает о прокси. Вы можете настроить свое приложение на создание https-ссылок. Вы можете использовать X-Forwarded-Proto и подобные заголовки, чтобы помочь в этом.
Вы не сказали, в чем проблема. Это вызывает проблему или вы просто хотите понять поведение системы? Если это не решит вашу проблему, отредактируйте свой вопрос, чтобы четко указать бизнес или техническую проблему, которую это вызывает, а затем прокомментируйте ответ.