Назад | Перейти на главную страницу

Nginx + ELB: перенаправить весь HTTP на HTTPS

Прежде чем читать дальше, я попытался понять / найти решение. Из подобных вопросов я не нашел ответа или хотя бы понял, что делаю не так.

Итак, у меня есть 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:

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 и подобные заголовки, чтобы помочь в этом.

Вы не сказали, в чем проблема. Это вызывает проблему или вы просто хотите понять поведение системы? Если это не решит вашу проблему, отредактируйте свой вопрос, чтобы четко указать бизнес или техническую проблему, которую это вызывает, а затем прокомментируйте ответ.