programing

Elastic Beanstalk nginx 지원 프록시 서버를 HTTP에서 HTTPS로 자동 리디렉션하려면 어떻게해야합니까?

nasanasas 2020. 12. 11. 08:17
반응형

Elastic Beanstalk nginx 지원 프록시 서버를 HTTP에서 HTTPS로 자동 리디렉션하려면 어떻게해야합니까?


Amazon Elastic Beanstalk에서 실행중인 Node.js 기반 사이트가 있습니다.

내 Node.js 앱은 포트 8080에서 수신 대기하고, EB 앱에서 nginx 탄력적로드 밸런서 구성을 사용하고 HTTP 및 HTTPS에 대해 포트 80 및 443에서 수신 대기합니다.

그러나 HTTPS를 통해 들어오는 내 앱의 트래픽 만 허용하고 싶습니다.

이 문제를 해결하기 위해 앱에서 무언가를 조작 할 수 있지만로드 밸런서가 모든 HTTP 요청을 HTTPS를 통해 내 사이트로 리디렉션하도록하는 방법에 관심이 있습니다.


Amazon의 유료 지원 아이디어로 여러 번 잘못된 시작을 한 후 결국에는 성공했습니다. 이 작업을 수행하는 방법은 포트 80과 443 모두에 응답하도록 환경을 구성하는 것입니다. 그런 다음 기본 Node.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.conf에 재 작성 규칙을 추가하는 배포 후크를 생성합니다.

(이전에는 별도의 파일을 /etc/nginx/conf.d에 복사하는 .config를 제공했지만 효과가 없거나 더 나쁜 것은 어떤 이유로 기본 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

이것이 미래에 다른 사람을 도울 수 있기를 바랍니다.


받아 들여진 대답은 더 이상 나를 위해 일하지 않았습니다. 기본 포트는 다른 포트입니다. 또한 구성 파일의 위치가 변경되었습니다. Puma로 Ruby On Rails 애플리케이션을 설정하고 있습니다.

유료 지원팀에 문의했는데 실행중인 인스턴스에서 수동으로 명령을 실행하여 알아 냈습니다. 그런 다음 아래 해결책을 알아낼 수있었습니다. 로그인하고 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

포트 번호와 구성 파일의 위치를 ​​어떻게 변경했는지 확인하십시오.


Node.js 앱을 통해 리디렉션을 처리 할 수 ​​있습니다.

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

나는 약간 더 간단한 해결책으로 이것을 작동시킬 수 있었다.

이것은로드 밸런싱이 아닌 탄력적 Beantalk 배포 단일 인스턴스입니다.

이것은 내가 추가 한 나의 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;
      }

AWS Elastic Beanstalk에서 위와 약간 다른 구성을 가질 수있는 'Ruby2 Puma'환경을 실행하고 있습니다. 내 환경에서는 'listen 8080'대신 'listen 80'을 사용해야했습니다.

elloworld111 의 답변을 기반으로 sslredirect.config :

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.conf에 삽입합니다. (더 우아한 솔루션이 있다면보고 싶어요)

이 스크립트를 사용하면 Beanstalk 상태 확인이 내 상태 확인 끝점 (내 경우 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

I was able to get this to work in a different way. I changed my load balancer to forward port 80 traffic to port 8082, and changed the firewall rules (inbound on the instance, outbound on the firewall) to allow that. And then added this file in .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--;
      }

The accepted answer did not work for me. After many tries (and hours of googling), I find something that did work for me. I too have a Node.js powered site that I'm running on Elastic Beanstalk.

I used the script from here : https://adamjstevenson.com/tutorials/2017/02/02/configuring-and-forcing-https-for-aws-elastic-beanstalk.html

The only modification I did was switch out the

/opt/elasticbeanstalk/support/conf/webapp_healthd.conf

by

/etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf

so it gives this :

files:
  "/tmp/45_nginx_https_rw.sh":
    owner: root
    group: root
    mode: "000644"
    content: |
      #! /bin/bash

      CONFIGURED=`grep -c "return 301 https" /etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf`

      if [ $CONFIGURED = 0 ]
        then
          sed -i '/listen 80;/a \    if ($http_x_forwarded_proto = "http") { return 301 https://$host$request_uri; }\n' /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_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

After eb deploy, just restart your nginx sudo service nginx restart and you're set.

참고URL : https://stackoverflow.com/questions/24297375/how-to-get-elastic-beanstalk-nginx-backed-proxy-server-to-auto-redirect-from-htt

반응형