Настройте apache на эластичном бобовом стебле
Я развиваюсь с django на эластичном beanstalk, и я хочу внести два изменения в конфигурацию apache:
1.
перенаправить www.domain.com на домен .com
2.
redirect http://domain.com в https://domain.com p >
У меня нет опыта работы с конфигурацией apache, в googling это дало мне идею, что я должен поместить RewriteRules в файл .htaccess.
Пример:
Как заставить https на эластичный beanstalk амазонки без проверки работоспособности
Я не мог найти инструкции о том, как это сделать с помощью конфигурации эластичного beanstalk (.ebextensions), я попытался просто поместить файл .htaccess в свой корневой файл и развернуть, но он не сработал.
Кто-нибудь знает, как можно добавить RewriteRules в эластичный бобовый стебель?
Ответы
Ответ 1
это простое решение
- 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 /etc/httpd/conf.d/wsgi.conf'
...
-
Разверните код.
- Развернутая версия wsgi.conf по адресу /etc/httpd/conf.d/wsgi.conf теперь включает необходимые правила перенаправления.
Он должен работать, и файл будет соответствующим образом обновлен для каждого развертывания. Единственное, на что нужно обратить внимание, это то, что Amazon изменит содержимое своего базового файла wsgi.conf в будущем, тогда ваша копия может перестать работать.
Источник: rickchristianson
Ответ 2
Имея www.example.com
перейти к example.com
, можно выполнить CNAME в DNS, если вам не нужно, чтобы он был перенаправлением. Если вам нужно перенаправить, вы можете добавить его в конфигурацию Apache ниже. Первичной точкой этого ответа является подробная информация о том, как вы изменяете конфигурацию Apache на Elastic Beanstalk (потому что делать это правильно не очень прямо).
Этот ответ предполагает, что вы уже включили 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
Ответ 3
Просто для справки для других, используя решение Zags для перенаправления не-www на www, добавьте это в свой .ebextensions/your_file.config
:
files:
"/etc/httpd/conf.d/www_rewrite.conf":
mode: "000644"
owner: root
group: root
content: |
RewriteEngine On
<If "'%{HTTP_HOST}' !~ /^www\./">
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</If>