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

현재 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 의 구성.



답변

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

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


답변

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

NGINX 설정

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

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

답변

이 솔루션은 조건부 논리를 사용하지만 허용되는 답변에서 알 수 있듯이 괜찮습니다. 참조 : 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;
  }
  ...
}

답변

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