Как получить Elastic Beanstalk nginx-backed proxy server для автоматического перенаправления с HTTP на HTTPS?
У меня есть узел.JS powered сайт, который я запускаю на Amazon Elastic Beanstalk.
Мой Узел.приложение js прослушивает порт 8080, и я использую конфигурацию nginx elastic load balancer с моим приложением EB, прослушивая порт 80 и 443 для HTTP и HTTPS.
тем не менее, я хочу принимать только трафик в моем приложении, который пришел через HTTPS.
Я мог бы установить что-то в приложении, чтобы справиться с этим, но я заинтересован в том, чтобы получить балансировщик нагрузки для перенаправления все HTTP-запросы на мой сайт через HTTPS.
7 ответов:
после нескольких ложных запусков с идеями из платной поддержки Amazon, они действительно прошли в конце. Способ заставить это работать-настроить среду для ответа на оба порта 80 и 443. Затем создайте папку в главном узле.папку приложение на JS под названием
.ebextensions
, а вы размещаете файл с именем00_nginx_https_rw.config
там, с этим текстом в качестве содержания:files: "/tmp/45_nginx_https_rw.sh": owner: root group: root mode: "000644" content: | #! /bin/bash CONFIGURED=`grep -c "return 301 https" /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf` if [ $CONFIGURED = 0 ] then sed -i '/listen 8080;/a \ if ($http_x_forwarded_proto = "http") { return 301 https://$host$request_uri; }\n' /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf logger -t nginx_rw "https rewrite rules added" exit 0 else logger -t nginx_rw "https rewrite rules already set" exit 0 fi container_commands: 00_appdeploy_rewrite_hook: command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/appdeploy/enact 01_configdeploy_rewrite_hook: command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact 02_rewrite_hook_perms: command: chmod 755 /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh 03_rewrite_hook_ownership: command: chown root:users /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh
команда поддержки Amazon объяснила: эта конфигурация создает крюк развертывания, который добавит правила перезаписи / etc/nginx / conf.d / 00_elastic_beanstalk_proxy.конф.
(ранее они предложили мне .конфигурации, которые копировали отдельные файлы в /etc/nginx / conf.d, но они либо не имели никакого эффекта, либо, что еще хуже, по какой-то причине перезаписывали или имели приоритет над конфигурацией nginx по умолчанию.)
если вы когда-нибудь захотите отменить это, т. е. удалить крючки, вам нужно удалить это ebextension и выпустить команду для удаления файлов, которые он создает. Вы можете сделать это либо вручную, или через команды ebextensions, которые вы временно устанавливаете:
/opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh
Я не пробовал, но предположительно что-то вроде этого будет работать, чтобы удалить их и отменить это изменение:
container_commands: 00_undochange: command: rm /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh 01_undochange: command: rm /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh
надеюсь, что это может помочь кому-то в будущем.
принятый ответ больше не работал для меня. Порт по умолчанию был другим. Также изменилось расположение конфигурационного файла. Я настраиваю приложение Ruby On Rails с Puma.
Я поговорил с платной поддержкой, мы выяснили это, просто запустив команды вручную на запущенном экземпляре. Затем я смог выяснить следующее решение. Просто войдя в систему и перезапустив nginx вещи, то работал.
files: "/tmp/45_nginx_https_rw.sh": owner: root group: root mode: "000644" content: | #! /bin/bash CONFIGURED=`grep -c "return 301 https" /opt/elasticbeanstalk/support/conf/webapp_healthd.conf` if [ $CONFIGURED = 0 ] then sed -i '/listen 80;/a \ if ($http_x_forwarded_proto = "http") { return 301 https://$host$request_uri; }\n' /opt/elasticbeanstalk/support/conf/webapp_healthd.conf logger -t nginx_rw "https rewrite rules added" exit 0 else logger -t nginx_rw "https rewrite rules already set" exit 0 fi container_commands: 00_appdeploy_rewrite_hook: command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/appdeploy/enact 01_configdeploy_rewrite_hook: command: cp -v /tmp/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact 02_rewrite_hook_perms: command: chmod 755 /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh 03_rewrite_hook_ownership: command: chown root:users /opt/elasticbeanstalk/hooks/appdeploy/enact/45_nginx_https_rw.sh /opt/elasticbeanstalk/hooks/configdeploy/enact/45_nginx_https_rw.sh
обратите внимание, как я изменил порт номер и расположение конфигурационного файла.
вы можете обрабатывать перенаправление через ваш узел.js app.
Amazon отправляет
X-Forwarded-Proto
заголовок, который равенhttp
когда клиент подключился небезопасно.следующее промежуточное программное обеспечение должно быть вставлено сразу после инициализации
Express
и перед определением маршрутов для автоматического перенаправления клиента на соответствующую конечную точку HTTPS:// Redirect to HTTPS app.use(function (req, res, next) { // Insecure request? if (req.get('x-forwarded-proto') == 'http') { // Redirect to https:// return res.redirect('https://' + req.get('host') + req.url); } next(); });
я смог заставить это работать с немного более простым решением.
обратите внимание, что это один экземпляр elastic beanstalk, а не с балансировкой нагрузки.
Это было мое ebextension я добавил.
files: "/etc/nginx/conf.d/000_my_config.conf": mode: "000755" owner: root owner: root content: | server { listen 8080; return 301 https://$host$request_uri; }
Я запускаю среду 'Ruby2 Puma' на AWS Elastic Beanstalk, которая может иметь немного другую конфигурацию, чем выше. В моей среде мне нужно было использовать "слушать 80" вместо "слушать 8080".
sslredirect.конфигурация на основе ответ elloworld111:
files: "/etc/nginx/conf.d/000_my_config.conf": mode: "000755" owner: root owner: root content: | server { listen 80; return 301 https://$host$request_uri; }
Я работаю с Elastic Beanstalk и Docker, поэтому взял немного другой маршрут, чтобы заставить вещи работать для меня, но очень вдохновленный принятым ответом. Этот скрипт вводит необходимую конфигурацию в /etc/nginx/sites-available / elasticbeanstalk-nginx-docker-proxy.конф. (Если у кого-то есть более элегантное решение, хотелось бы его увидеть)
этот скрипт также позволяет Beanstalk healthcheck попасть в мою конечную точку healthcheck (в моем случае api/healthcheck) лучше разрешить LoadBalancer, чтобы попасть в приложение, а не завершить в Nginx.
files: "/tmp/45_nginx_https_rw.sh": owner: root group: root mode: "000755" content: | #! /bin/bash CONFIGURED=`grep -c "return 301 https" /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf` if [ $CONFIGURED = 0 ] then sed -i "/access.log;/a \ \ \ \ \ \ \ \ location /api/health-check { proxy_pass http://docker; }" /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf sed -i "/proxy_add_x_forwarded_for;/a \ \ \ \ \ \ \ \ \ \ \ \ if ($http_x_forwarded_proto != 'https') { return 301 https://$host$request_uri; }" /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf logger -t nginx_rw "https rewrite rules added" exit 0 else logger -t nginx_rw "https rewrite rules already set" exit 0 fi container_commands: 00_run_script: command: /tmp/45_nginx_https_rw.sh
я смог заставить это работать по-другому. Я изменил свой балансировщик нагрузки, чтобы перенаправить трафик порта 80 на порт 8082, и изменил правила брандмауэра (входящие на экземпляре, исходящие на брандмауэре), чтобы разрешить это. А потом добавил этот файл .ebextensions:
files: "/etc/nginx/conf.d/50-atd-hotel-http-redirect.conf": mode: "000644" owner: root group: root content: | server { listen 8082; return 301 --WHATEVER DESTINATION YOU WANT--; }