Как получить 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 54

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--;
      }