Пересылка http на https в балансировщиках нагрузки AWS

Вот функция расширения для разделения с разделителем строк:

public static string[] Split(this string value, string seperator)
{
    return value.Split(new string[] { seperator }, StringSplitOptions.None);
}

Пример использования:

string mystring = "one[split on me]two[split on me]three[split on me]four";
var splitStrings = mystring.Split("[split on me]");
0
задан Jay 13 July 2018 в 21:29
поделиться

3 ответа

При использовании балансировщика нагрузки в AWS общим вариантом использования является установка SSL-сертификата на балансировщик нагрузки. Это обычно называется разгрузкой SSL или балансировкой нагрузки уровня 7. Трафик с балансировщика нагрузки на экземпляр EC2 не зашифрован и обычно превышает порт 80 (иногда 8080) (HTTP). Трафик с клиента на ваш балансировщик нагрузки определяется создателями, которые вы создали.

Балансировка нагрузки уровня 4 использует TCP для связи с вашим экземпляром EC2 и вы устанавливаете SSL-сертификат на свой веб-сервер. Затем ваш веб-сервер знает, к какому порту подключается клиент, и следующее НЕ ПРИМЕНЯЕТ.

Ваш код, на котором работает ваш веб-сайт, должен проверить, подключен ли клиент к балансировщику нагрузки, используя HTTPS. Если это правда, не перенаправляйте клиента. Если клиент подключен к балансировщику нагрузки, используя HTTP, затем перенаправляет клиент.

Следующий код PHP показывает, как читать заголовки Load Balancer, которые отправляются в ваш экземпляр EC2, чтобы определить, подключен ли клиент к HTTPS , Если вы не используете такой язык, как PHP или Nodes.js, вы также можете создавать конфигурации Apache, которые знают, как читать правильные заголовки (пример внизу).

function require_ssl()
{
        global $config_require_ssl;

        if ($config_require_ssl == FALSE)
        {
                return;
        }

        if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']))
        {
                if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
                {
                       $_SERVER['HTTPS']='on';
                }
        }

        if(empty($_SERVER['HTTPS']) || $_SERVER["HTTPS"] != "on")
        {
                header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);

                exit();
        }
}

Это код для Apache:

<VirtualHost *:80>
    RequestHeader set X-Forwarded-Proto "http"
    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    …
</VirtualHost>
1
ответ дан John Hanley 17 August 2018 в 12:10
поделиться
  • 1
    FYI, я использую Python в качестве базового языка. Пункт моего вопроса: «Что делать, если сервер Apache удален?» Балансировщик нагрузки удаляет экземпляр EC2. Вот почему я стараюсь избегать установки кодов перенаправления внутри сервера Apache. Это то же самое, что я хочу установить SSL на балансировщик нагрузки, НЕ на сервере Apache, потому что если экземпляр EC2 будет удален, я потеряю свой SSL. – Jay 14 July 2018 в 00:31
  • 2
    Портируйте PHP на Python или используйте конфигурацию Apache. Вам не хватает одного компонента в вашем дизайне. Настройте свой сервер именно так, как вам нужно. Затем создайте AMI. Укажите, что AMI в вашей конфигурации запускает экземпляры EC2. Существуют также другие методы, такие как указание пользовательских данных при запуске экземпляра, который настраивает новый экземпляр. Мой предпочтительный язык - Python, поэтому я должен переносить свой PHP на Python, но мне нравится PHP для веб-сайтов. – John Hanley 14 July 2018 в 00:36

Вы можете отключить трафик SSL на балансировщике нагрузки приложений (ALB) и связь между ALB, и вы можете настроить перенаправление с http на https с помощью конфигурации веб-сервера EC2.

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

0
ответ дан Ashan 17 August 2018 в 12:10
поделиться

Вам нужно настроить приложение, которое у вас запущено в Elastic Beanstalk, для настройки перенаправления Http на Https.

Затем при настройке Load Balancer через Elastic Beanstalk создайте 2 прослушивателя, один для порт 80 и один для 433, которые передаются вперед.

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-cfg-alb.html

0
ответ дан Kevin Smith 17 August 2018 в 12:10
поделиться
  • 1
    Я уже настроил приложение. Существует ли настройка переадресации в разделе Конфигурация в эластичном бобовом стебле? – Jay 13 July 2018 в 20:38
  • 2
    @jay обновлено с дополнительной информацией и ссылкой – Kevin Smith 13 July 2018 в 21:08
  • 3
    Это то, что я уже сделал. Чтобы убедиться, я обновил свой пост с изображением моих слушателей в балансировщике нагрузки. Можете ли вы проверить это, правильно ли я настроен? – Jay 13 July 2018 в 21:30
  • 4
    Это выглядит правильно, действительно ли группы безопасности открывают правильные порты? – Kevin Smith 13 July 2018 в 22:45
  • 5
    О, я вижу, что вы пересылаете на этом сервере как 443, так и 80 - 80, вам нужно переслать трафик с 443 на порт 443 на этом компьютере. В качестве альтернативы используйте 81, чтобы сделать его менее запутанным, поскольку вы не используете https между балансировщиком нагрузки и экземпляром EC2 – Kevin Smith 13 July 2018 в 22:47
Другие вопросы по тегам:

Похожие вопросы: