if를 사용하지 않고 Amazon ELB 뒤의 모든 http 요청을 https로 리디렉션


27

현재 http://www.example.orghttps://www.example.org 모두를 제공하는 ELB가 있습니다 .

http://www.example.org를 가리키는 모든 요청 이 https://www.example.org 로 리디렉션 되도록 설정하고 싶습니다 .

ELB는 다음을 사용하여 https 요청을 http 요청으로 보냅니다.

server {
      listen         80;
       server_name    www.example.org;
       rewrite        ^ https://$server_name$request_uri? permanent;
}

https://www.example.org에 대한 요청 은 여전히 ​​nginx의 포트 80으로 보내지기 때문에 작동하지 않습니다 .

나는 그것을 다음과 같이 다시 쓸 수 있다는 것을 알고있다.

server {
      listen         80;
      server_name    www.example.org;
      if ($http_x_forwarded_proto != "https") {
          rewrite ^(.*)$ https://$server_name$1 permanent;
      }
}

그러나 내가 읽은 모든 내용은 ifnginx 구성 내에서 모든 비용을 피해야한다고 말 했으며 이는 모든 단일 요청에 해당됩니다. 또한 이는 상태 확인을 위해 별도의 별도 구성을 설정해야 함을 의미합니다 ( "... 설명 :"… ELB 뒤에있는 경우 ELB가 HTTPS 엔드 포인트 역할을하고 서버로 HTTP 트래픽 만 보내는 경우) ELB에 필요한 상태 점검을 위해 HTTP 200 OK 응답으로 응답하는 기능을 중단하십시오 ").

nginx 구성 대신 웹 응용 프로그램 코드에 로그인을 고려하는 것을 고려하고 있습니다 (이 질문의 목적을 위해 Django 기반 응용 프로그램이라고 가정 해 봅시다). if 의 구성.


이 코드를 어디에 넣었는지 알려주세요.
YuAn Shaolin Maculelê Lai 2016

@ YuAnShaolinMaculelêLai 물론입니다. 이들은 nginx의 설정 파일이므로, 코드를 /etc/nginx/conf.d/의 파일에 넣습니다. 보통 domainname.conf 파일의 이름을 지정합니다. 여기서 "domainname"은 해당 웹 사이트의 도메인입니다. .conf로 끝나는 파일 이름을 원하는대로 지정할 수 있습니다.
Jordan Reiter

대단히 감사합니다. .conf 다음에 새 파일을 만들려고했습니다. 그러나 그것은 나를 위해 작동하지 않았습니다. 그런 다음 AWS에서 생성 한 파일에 코드를 /etc/nginx/conf.d/에 넣습니다. 지금 작동합니다.
YuAn Shaolin Maculelê Lai

답변:


9

그것이 제대로 작동한다면 두려워하지 마십시오. http://wiki.nginx.org/IfIsEvil

if의 동작이 일치하지 않으면 두 개의 동일한 요청이 있으면 하나의 요청에 무작위로 실패하지 않고 다른 작업을 수행하며 적절한 테스트 및 사용 가능한지 이해 하여 작동합니다 . 그래도 가능한 경우 다른 지시문을 사용하라는 조언이 여전히 적용됩니다.


이 페이지는 또한 "위치 컨텍스트에서 사용될 때 문제가있는 경우"라고 말합니다. 당신이 밖에서 할 필요가있는 일을 할 수있는 날 것으로 보인다 location {}에서, server {}대신. (그러나 이것이 틀렸다면 알려주십시오!)
Excalibur

15
  1. ELB : 80을 인스턴스 : 80으로, ELB : 443을 인스턴스 : 1443으로 AWS ELB 매핑을 설정하십시오.
  2. 포트 80과 1443에서 수신 대기하도록 nginx를 바인딩하십시오.
  3. 포트 80에 도착한 요청을 포트 443으로 전달합니다.
  4. 상태 확인은 HTTP : 1443이어야합니다. 301 리디렉션 때문에 HTTP : 80을 거부합니다.

aws elb 설정

NGINX 설정

    server {
       listen         80;
       server_name    www.example.org;
       rewrite        ^ https://$server_name$request_uri? permanent;
    }

    server {
       listen         1443;
       server_name    www.example.org;
   } 

상태 확인 설정은 어떻습니까? 그것에 대해 자세히 설명해 주시겠습니까?
samkhan13

helth check가 http : 80으로 설정된 경우에는 작동하지 않으며 상태 점검이 실패합니다.
samkhan13

2
건강 검진은이어야합니다 HTTP:1443. HTTP:80301 리디렉션 때문에 거부합니다 .
cbron

이것은 주로 나를 위해 일했지만 재 작성 줄은 내 와일드 카드 도메인에서 작동하지 않았습니다. 이 다른 게시물은 해당 부분을 수정했습니다. serverfault.com/questions/447258/…
Ron

9

이 솔루션은 조건부 논리를 사용하지만 허용되는 답변에서 알 수 있듯이 괜찮습니다. 참조 : https://stackoverflow.com/questions/4833238/nginx-conf-redirect-multiple-conditions

또한 이미지의 aws 보안 설정에서 추가 포트를 열 필요가 없습니다. AWS LB에서 ssl을 종료하고 https 트래픽을 인스턴스의 http 포트 80으로 라우팅 할 수 있습니다.

이 예제에서 LB 상태 확인은 앱 서버로 라우팅되는 포트 80에서 / health에 도달하므로 상태 확인은 nginx와 앱의 호흡 여부를 확인합니다.

server {
  listen 80 default deferred;

  set $redirect_to_https 0;
  if ($http_x_forwarded_proto != 'https') {
    set $redirect_to_https 1;
  }
  if ($request_uri = '/health') {
    set $redirect_to_https 0;
  }
  if ($redirect_to_https = 1) {
    rewrite ^ https://www.example.com$request_uri? permanent;
  }
  ...
}

1
이 작업을 수행하는보다 우아한 방법이 있어야합니다.
Edward

0

이제 HTTP 포트 80을 HTTPS 포트 443으로 리디렉션하는 AWS로드 밸런서 설정에서 새 리스너를 생성 할 수 있습니다. 따라서 더 이상 nginx / apache 구성을 건드릴 필요가 없습니다.


불행하게도, 아직 Cloudformation에서 지원되지 않습니다
Aryeh Leib Taurog
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.