Подтвердить что ты не робот

Как заставить https на эластичный beanstalk амазонки без проверки работоспособности

Я настроил среду Elastic Beanstalk для перенаправления всех страниц на https, перенаправление работает, однако экземпляр не проверяет работоспособность и заканчивается, любые идеи по настройке правил перезаписи?

Моя конфигурация:

NameVirtualHost *:80

<VirtualHost *:80>
.
.
.

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule !/_hostmanager/healthcheck https://%{SERVER_NAME}%{REQUEST_URI} [L,R] 
</VirtualHost>
4b9b3361

Ответ 1

Здесь есть несколько URL-адресов hostmananger, к которым требуется доступ к эластичному beanstalk, кроме проверки работоспособности. Grepping /var/log/httpd/elasticbeanstalk-access_log, я вижу запросы /_hostmanager/tasks и /_hostmanager/healthcheck.

Вот правила, которые я добавил в /etc/httpd/sites/elasticbeanstalk в моих экземплярах EC2:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REQUEST_URI} !^/status$ 
RewriteCond %{REQUEST_URI} !^/version$ 
RewriteCond %{REQUEST_URI} !^/_hostmanager/ 
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

Обратите внимание, что я также разрешаю трафик, отличный от https, на мои страницы /status и /version. Я фактически использую /status в качестве фактического URL-адреса для проверки работоспособности, поэтому, если этот трафик пропустить, переписывание позволит избежать перенаправления и ускорить поиск статуса (я предполагаю).

Ответ 2

Я думаю, что некоторые из других ответов здесь могут не основываться на том, что в настоящее время установлено произвольным User-Agent AWS. Когда я смотрю журналы Apache, я вижу этого User-Agent:

ELB-HealthChecker/1.0

С момента написания этого для меня работает следующее правило mod_rewrite:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTP_USER_AGENT} !^ELB-HealthChecker.* 
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

Ответ 3

По состоянию на 2016 год ни один из этих ответов не работает для меня, но это сработало:

1 Получить /etc/httpd/conf.d/wsgi.conf

2 Добавьте к виртуальному хосту следующее: (Обратите внимание, что третья строка предотвращает проблему, когда настройка script /opt/elasticbeanstalk/hooks/config.py ждет 5 минут, не загружая путь /.)

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTP_HOST} !localhost
RewriteCond %{HTTP_USER_AGENT} !^ELB-HealthChecker.* 
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]

3 Поместите файл в свой репозиторий и добавьте следующую команду контейнера:

06_https:
  command: "cp wsgi.conf /opt/python/ondeck/wsgi.conf"

Этот файл затем автоматически копируется установкой script в /etc/httpd/conf.d.

Ответ 4

Похоже, что AWS Health Checker использует пользовательский агент AWSHealthCheck.

Я обошел это, избегая переадресации, если запрос пришел из User Agent агента проверки работоспособности.

SOmething like:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{USER_AGENT} !^AWSHealthCheck$ 
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

Ответ 5

Вы можете настроить ELB на использование определенного пути для проверки работоспособности, например /ping. Затем вы можете явно указать apache не перенаправлять этот URL, а не полагаться на строку UserAgent.

Вы также можете указать ELB использовать HTTPS для проверки работоспособности, а затем перенаправить все HTTP-URL на HTTPS, включая проверку работоспособности.

Обе эти настройки могут быть изменены в консоли EC2 в разделе "Балансировка нагрузки".

Ответ 6

Если вы пытаетесь сделать это в Wordpress или PHP, вы можете настроить свой .htaccess следующим образом, не изменяя ничего через .ebextensions:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REQUEST_URI} !^/status\.html$
RewriteCond %{REQUEST_URI} !^/_hostmanager/
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
</IfModule>

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Не забудьте изменить status.html на любой путь, который вы используете для проверки работоспособности вашего эластичного beanstalk

Подробнее см. мой ответ здесь.

Ответ 7

Создайте static health.html. Если возможно, в качестве шаблона конфигурации.

Ответ 8

это простое решение

  • ssh в ваш экземпляр EC2
  • скопируйте содержимое файла /etc/httpd/conf.d/wsgi.conf в локальный файл wsgi.conf, который будет помещен в базовую папку вашего приложения.
  • Отредактируйте локальную версию wsgi.conf и добавьте следующие правила переадресации в <VirtualHost> </Теги VirtualHost >

    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule !/status https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]
    
  • Измените "/статус" на любую страницу, которую вы используете, на странице проверка работоспособности.

  • Сохранить файл
  • Отредактируйте свой <app> .conf внутри вашего каталога ebextensions, чтобы добавить команду контейнера для копирования этой версии wsgi.conf поверх версии Amazons

    container_commands:
    01_syncdb:
      command: "django-admin.py syncdb --noinput" leader_only: true
    02_collectstatic:
      command: "django-admin.py collectstatic --noinput"
    03_wsgireplace:
      command: 'cp wsgi.conf ../wsgi.conf'
    ...
    
  • Разверните код.

  • В развернутой версии wsg.conf по адресу /etc/httd/conf.d/wsgi.conf теперь будут указаны необходимые правила перенаправления.

Он должен работать, и файл будет соответствующим образом обновлен для каждого развертывания. Единственное, на что нужно обратить внимание, это то, что Amazon изменит содержимое своего базового файла wsgi.conf в будущем, тогда ваша копия может перестать работать.

Autor rickchristianson

Ответ 9

Для меня копирование wsgi.conf на место никогда не срабатывало. Либо ЭБ не удастся развернуть, либо файл будет перезаписан.

Единственный ответ, который я нашел, который работал, - здесь. По существу, он использовал sed, чтобы вставить необходимые правила перезаписи в wsgi.conf. Он говорит, что добавленная команда контейнера

container_commands:
  01_http_to_https_redirect:
    command: 
      sed -i '/\<VirtualHost \*:80\>/a RewriteEngine On\nRewriteCond %{HTTP:X-Forwarded-Proto} !https\nRewriteRule \!/robots.txt https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]' /opt/python/ondeck/wsgi.conf

Не забудьте изменить конечную точку проверки работоспособности с robots.txt.

Ответ 10

В качестве общей стратегии, что сработало для нас, с экземплярами Apache и Nginx EC2, расположенными за защищенным балансиром нагрузки AWS, является:

  • На балансировщике нагрузки переместите порт 80 на порт 80 на экземплярах
  • прямой порт 443 на порт 8080 (например) в экземплярах
  • На веб-сервере прослушивайте оба порта (80 и 8080).
  • перенаправить порт 80 в порт 443
  • Добавить переменную среды "HTTPS" со значением "on" в EC2, например. используя конфигурацию программного обеспечения эластичного beanstalk.

Шаг 1 гарантирует, что внутренний трафик AWS обрабатывается "естественно".

Шаг 2 позволяет только защищенному внешнему трафику достичь нашего кода

Шаг 5 сообщает веб-серверу и что за ним (Laravel, в нашем случае), что сгенерированный URL-адрес должен быть предоставлен схеме https:. Другим фреймворкам могут потребоваться некоторые другие переменные среды, установленные для того, чтобы вызвать это поведение.

Ответ 11

Этот ответ предполагает, что вы уже включили https в группе безопасности балансировки нагрузки, добавили сертификат SSL в балансировщик нагрузки, добавили 443 в порты, перенаправленные балансировщиком нагрузки, и указали свое доменное имя в среде Elastic Beanstalk с помощью Route 53 (или эквивалентная служба DNS).

Все, что вам нужно сделать, это добавить следующее в один из .conf файлов в каталог .ebextensions вашего проекта:

files:
    "/etc/httpd/conf.d/ssl_rewrite.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            RewriteEngine On
            <If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
            RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
            </If>

Описание

Это умеренно прямо за пределами эластичного бобового стебля. Обычно добавляется правило перезаписи Apache, например:

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Или, если за балансиром нагрузки, как и в этом случае:

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

Однако эти конфигурации работают только в блоке <VirtualHost>. Изменение блока RewriteCond на <If> позволяет корректно работать за пределами блока <VirtualHost>, что позволяет нам вставить автономный конфигурационный файл Apache. Обратите внимание, что стандартная установка Apache в CentOS (включая настройку на ElasticBeanstalk) включает все файлы, соответствующие /etc/httpd/conf.d/*.conf, которые соответствуют пути файла, в котором мы храним этот файл.

Часть условия -n '%{HTTP:X-Forwarded-Proto}' предотвращает перенаправление, если вы не находитесь за балансировщиком нагрузки, что позволяет вам иметь общую конфигурацию между производственной средой с балансировщиком нагрузки и https и промежуточную среду, которая представляет собой единый экземпляр и не имеет https. Это не обязательно, если вы используете балансировщики нагрузки и https во всех своих средах, но это не повредит.

Плохие решения, которые я видел

Я видел много плохих решений этой проблемы, и стоит прочесть их, чтобы понять, почему это решение необходимо.

  • Использовать Cloudfront:. Некоторые люди предлагают использовать не кэшированную настройку Cloudfront перед Elastic Beanstalk для перенаправления HTTP на HTTPS. Это добавляет совершенно новую услугу (что добавляет сложности), что не совсем подходит (Cloudfront - это CDN, это не правильный инструмент для принудительного HTTPS для наследуемого динамического контента). Конфигурация Apache - это нормальное решение этой проблемы, а Elastic Beanstalk использует Apache, чтобы мы могли идти.

  • SSH на сервер и...: Это совершенно противоречит точке Elastic Beanstalk и имеет так много проблем. Любые новые экземпляры, созданные автомасштабированием, не будут иметь модифицированную конфигурацию. Любая клонированная среда не будет иметь конфигурацию. Любое количество разумного набора изменений среды уничтожит конфигурацию. Это такая плохая идея.

  • Перезаписать конфигурацию Apache с новым файлом: Это попадает в правильную область решения, но оставляет вас в кошмаре обслуживания, если Elastic Beanstalk изменяет аспекты настройки сервера (что они очень хорошо может сделать). Также см. Проблемы в следующем элементе.

  • Динамически редактировать конфигурационный файл Apache, чтобы добавить несколько строк: Это достойная идея. Проблемы с этим в том, что он не будет работать, если Elastic Beanstalk когда-либо изменяет имя своего конфигурационного файла Apache по умолчанию и что этот файл может быть перезаписан, когда вы меньше всего ожидаете: https://forums.aws.amazon.com/thread.jspa?threadID=163369