현재 http://www.example.org 및 https://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;
}
}
그러나 내가 읽은 모든 내용은 if
nginx 구성 내에서 모든 비용을 피해야한다고 말 했으며 이는 모든 단일 요청에 해당됩니다. 또한 이는 상태 확인을 위해 별도의 별도 구성을 설정해야 함을 의미합니다 ( “… 설명 :”… ELB 뒤에있는 경우 ELB가 HTTPS 엔드 포인트 역할을하고 서버로 HTTP 트래픽 만 보내는 경우) ELB에 필요한 상태 점검을 위해 HTTP 200 OK 응답으로 응답하는 기능을 중단하십시오 “).
nginx 구성 대신 웹 응용 프로그램 코드에 로그인을 고려하는 것을 고려하고 있습니다 (이 질문의 목적을 위해 Django 기반 응용 프로그램이라고 가정 해 봅시다). if
의 구성.
답변
그것이 제대로 작동한다면 두려워하지 마십시오. http://wiki.nginx.org/IfIsEvil
if의 동작이 일치하지 않으면 두 개의 동일한 요청이 있으면 하나의 요청에 무작위로 실패하지 않고 다른 작업을 수행하며 적절한 테스트 및 사용 가능한지 이해 하여 작동합니다 . 그래도 가능한 경우 다른 지시문을 사용하라는 조언이 여전히 적용됩니다.
답변
- ELB : 80을 인스턴스 : 80으로, ELB : 443을 인스턴스 : 1443으로 AWS ELB 매핑을 설정하십시오.
- 포트 80과 1443에서 수신 대기하도록 nginx를 바인딩하십시오.
- 포트 80에 도착한 요청을 포트 443으로 전달합니다.
- 상태 확인은 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 구성을 건드릴 필요가 없습니다.