EC2 Elastic Load Balancer를 HTTP에서 HTTPS로 리디렉션


104

모든 HTTP 요청을 ELB의 https 요청으로 리디렉션하고 싶습니다 . 두 개의 EC2 인스턴스가 있습니다. 서버에 nginx를 사용하고 있습니다. 나는 성공하지 않고 nginx conf 파일을 다시 작성하려고 시도했습니다. 나는 그것에 대한 몇 가지 조언을 원합니다.


1
인터넷은이 문제에 대한 하나의 완전하고 작동하는 해결책에 동의 할 수없는 것 같습니다. 내 게시물에서 도움을받을 수 있기를 바랍니다 . 마침내이 문제를 해결하기 위해 농구를 뛰어 넘어야했습니다.
— ADTC 2017

1
이 ans 에는 승인 된
— 답변이

답변:


87

AWS Application Load Balancer는 이제 네이티브 HTTP에서 HTTPS 로의 리디렉션을 지원합니다.

콘솔에서이를 활성화하려면 다음을 수행하십시오.

  1. EC2의로드 밸런서로 이동하여 "리스너"탭
  2. HTTP 리스너에서 "규칙보기 / 편집"을 선택하십시오.
  3. 기본 규칙을 제외한 모든 규칙 삭제 (하단)
  4. 기본 규칙 편집 : 작업으로 "Redirect to"를 선택하고 모든 항목을 기본값으로두고 "443"을 포트로 입력합니다.

기본 리디렉션 리스너 규칙

여기에 설명 된대로 CLI를 사용하여 동일한 작업을 수행 할 수 있습니다 .

다음과 같이 Listener 개체를 설정해야하는 Cloudformation에서도이 작업을 수행 할 수 있습니다.

  HttpListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      LoadBalancerArn: !Ref LoadBalancer
      Port: 80
      Protocol: HTTP
      DefaultActions:
      - Type: redirect 
        RedirectConfig:
          Protocol: HTTPS
          StatusCode: HTTP_301
          Port: 443

여전히 Classic Load Balancer를 사용하는 경우 다른 구성에서 설명한 NGINX 구성 중 하나로 이동하십시오.


1
지금 쉽게 알면 매우 유용합니다. 그러나 이것은 단지 링크 대신 구성 할 항목에 대한 더 많은 정보가있는 더 나은 대답이 될 것입니다.
— John Rees

1
@JohnRees이 도움이되기를 바랍니다, 그에 따라 답을 편집
— 은 Ulli

좋은. 당신을 제로로 만들기 위해 찬성했습니다. 너는 더받을 자격이있다.
— John Rees

2
@florian Classic Load Balancer를 사용중인 것 같습니다. 해당 옵션을 얻으려면 Application Load Balancer로 전환
— Ulli

내 인스턴스에 Application Load Balancer를 어떻게 할당합니까? ( instances탭 이 없기 때문에 )
— Florian

107

ELB는 X-Forwarded-Proto헤더를 설정 합니다.이를 사용하여 원래 요청이 HTTP에 대한 것인지 감지하고 HTTPS로 리디렉션 할 수 있습니다.

serverconf 에서 이것을 시도 할 수 있습니다 .

if ($http_x_forwarded_proto = 'http') {
    return 301 https://yourdomain.com$request_uri;
}

ELB 문서를 살펴보십시오 .


3
이 구성은 어디에서 수행합니까?
— ericpeters0n

2
@ ericpeters0n 답변의 스 니펫은 nginx구성 용 이지만 원칙은 모든 웹 서버에 적용됩니다.
— Dmitry Mukhin

1
Passenger-standalone과 함께 beantalk를 사용하는 경우 nginx 구성 변경 방법에 대한이 링크를 따르십시오. qiita.com/tak_nishida/items/cf30a2d373744943b943
— 연호

3
로드 밸런서에 HTTP 및 HTTPS 리스너가 있는지 확인하십시오.
— Gavin Palmer

1
@Ronald, 응답에서 서버 conf에 의해 ELB 뒤에서 실행되는 ec2 인스턴스의 nginx 서버를 의미합니다.
— Dmitry Mukhin 19.01.30

34

내 상황에서 HTTPS는 ELB가 전적으로 처리했으며 소스 도메인을 미리 몰랐기 때문에 동일한 문제가 발생하여 다음과 같은 작업을 수행했습니다.

server {
  listen 81;
  return 301 https://$host$request_uri;
}

server {
  listen 80;
  # regular server rules ...
}

그리고 물론 ELB 'https'는 인스턴스 포트 80을 가리키고 'http'경로는 인스턴스 포트 81을 가리 킵니다.


3
이것은 천재입니다.
— Andy Hayden

2
이의 nginx 설정이다 @CodyBugstein 하나가있는 경우
— timurso

@timurso가 있다면 무엇입니까?
— CodyBugstein

응용 프로그램 앞에 nginx가있는 경우 @CodyBugstein (예
— 아니요-ExpressJS를

nginx는 어디로 갈까요? ELB 내부? EC2 내부? Elastic Beanstalk에서 어딘가에 구성되어 있습니까?
— CodyBugstein 2018

16

Amazon Elastic Load Balancer (ELB)는 X-FORWARDED-PROTO라는 HTTP 헤더를 지원합니다. ELB를 통과하는 모든 HTTPS 요청은 "HTTPS"와 같은 X-FORWARDED-PROTO 값을 갖습니다. HTTP 요청의 경우 다음과 같은 간단한 재 작성 규칙을 추가하여 HTTPS를 강제 실행할 수 있습니다. 나를 위해 그것은 잘 작동합니다!

Apache

.htaccess 파일에 다음 줄을 추가 할 수 있습니다.

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}

또는 동일한 EC2 웹 서버에서 여러 도메인을 관리하기 위해 vhost.conf를 사용하는 경우 vhost.conf에 다음을 추가 할 수 있습니다 (https를 사용하려는 도메인에 추가).

<VirtualHost *:80>
...
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
...
</VirtualHost>

IIS

구성 GUI를 사용하여 IIS Url-Rewrite 모듈을 설치하고 다음 설정을 추가합니다.

<rewrite xdt:Transform="Insert">
<rules>
<rule name="HTTPS rewrite behind ELB rule" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions>
<add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://{SERVER_NAME}{URL}" />
</rule>
</rules>
</rewrite>

여기에서 더 많은 것을 읽으 십시오


헤더가 존재하지 않기 때문에 인스턴스가 정상적인 http 트래픽을 리디렉션하는 문제가있었습니다. 나는 조건을 만들어 그것을 해결 :RewriteCond %{HTTP:X-Forwarded-Proto} !(https|^$)
— natronite

이로 인해 무한 리디렉션이 발생합니다. Windows 서버와 함께 IIS를 사용하고 있습니다.
— 그것은 함정

@ It'satrap : IIS의 경우 작동하지 않으면 다음 URL에서 스크립트를 시도하십시오. stephen.genoprime.com/2012/01/01/aws-elb-ssl-with-iis.html
— Iman Sedighi

5

위의 htaccess 솔루션으로 인해 ELB 상태 확인이 실패했습니다. 나는 누군가가 내가 가진 것과 같은 문제를 가지고있는 온라인 기사를 발견 할 때까지 해결책을 찾는 데 어려움을 겪었다. 그의 해결책은 대신 이것을 htaccess 파일의 시작 부분에 추가하는 것이 었습니다.

RewriteEngine on 
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

ELB를 통해 외부 요청을 HTTPS로 리디렉션하는 동안 HTTP를 통한이 요청과 기타 로컬 요청을 허용하려면 https에서 부정적으로 일치하는 대신 http에서 일치하도록 다시 쓰기 조건을 조정합니다.

출처 : AWS 및 ELB를 사용하여 HTTP를 HTTPS로 리디렉션


"https에서 부정적으로 일치하는 대신 http에서 일치하도록 재 작성 조건을 조정하십시오"가 제가 고치려고했던 부분입니다. 감사합니다!
— Merricat


3

nginx 및 ELB 구성에 이상한 문제가 있습니다. 내 설정에는 ELB 뒤에있는 하나의 nginx 내부에 3 개의 다른 서비스가 포함되었습니다. 그리고 혼합 콘텐츠 문제가 있습니다 .ELB에 대한 요청이 https이지만 ELB http 내부에만 있고 서버가 http를 사용하여 정적에 대한 상대 경로를 생성하므로 브라우저가 '혼합 콘텐츠'문제로 실패합니다. 그리고 리디렉션없이 http / https 작업에 대한 솔루션을 만들어야합니다.

다음은 nginx/conf.d/폴더 에있는 구성입니다 .

# Required for http/https switching
map $http_x_forwarded_port $switch {
  default   off;
  "80"    off;
  "443"   on;
}

이것은 우리가 실제 클라이언트 프로토콜이 무엇인지 알 수 있음을 의미합니다. 보시다시피 $switchvar에 있습니다. 그리고 현재 필요한 모든 위치에서 이것을 사용합니다.

location ~ /softwareapi/index.php {
  fastcgi_param HTTPS $switch;
  .. other settings here ..
}

HTTPS 설정을 사용하면 PHP 응용 프로그램이 올바른 프로토콜을 자동으로 감지하고 혼합 콘텐츠 문제를 방지하기 위해 신중하게 상대 경로를 구축합니다.

친애하는.


3

@Ulli의 답변을 기반으로 Terraform 을 사용하여 구성하려면 여기에 예가 있습니다>

resource "aws_alb_listener" "web" {
  load_balancer_arn = "${aws_alb.web.arn}"

  port              = "80"
  protocol          = "HTTP"

  default_action {
    type = "redirect"

    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
}

출처


-2

.ebextensions/00_forward_http_to_https.config다음 내용 으로 파일 을 만듭니다 .

files: 
  /tmp/deployment/http_redirect.sh:
    mode: "000755"
    content: |
      APP_URL=`/opt/elasticbeanstalk/bin/get-config environment --output yaml | grep -oP 'APP_URL: \K([^\s)\"](?!ttp:))+'`
      sed -ie 's@$proxy_add_x_forwarded_for;@$proxy_add_x_forwarded_for;\n        if ($http_x_forwarded_proto = 'http') { return 301 https://'"$APP_URL"'$request_uri; }@' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf

container_commands:
  http_redirect:
    command: "/tmp/deployment/http_redirect.sh"

미리 AWS 관리 콘솔에서 APP_URL 환경 변수를 설정해야합니다.


ELB와 TCP 연결의 균형을 맞출 때 어떻게해야합니까?
— 붐

1
귀하의 답변이 질문에 맞는 위치를 알지 못합니다 ... 당신은 Elastic bean stalk에 대해 이야기하고 있으며 질문은 EC2 내부의 nginx에 관한 것입니다.
— jvarandas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.