redirection 문제
회사에서 데모를 위한 웹서버를 띄우기 위해 AWS 인프라를 구축할 일이 생겼습니다.
기본적으로 AWS의 ELB와 EC2 그리고 Nginx만을 이용한 간단한 웹 서버를 구축하였는데, 이때 HTTPS 인증서를 로드벨런서(ELB)에 붙이고, 타겟그룹을 만들어서 EC2 Nginx로 전달하였습니다.
이때 아래와 같은 문제가 발생하였습니다.
https://example.com/ => HTTPS로 동작
http://example.com/ => HTTP로 동작
https://example.com/folder => HTTP로 동작 (http://example.com/folder/ 으로 이동)
저는 HTTP로 접속이 되더라도 HTTPS로 동작하는 웹서버를 구축해야 했습니다.
저희 회사 SDK를 이용하기 위해서는 항상 HTTPS로 접근을 하여야 하기 때문이었습니다.
ELB, 타겟그룹, EC2 구조
ELB 설정
Target Group 설정
EC2 Nginx Conf 설정
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name example.com;
location / {
try_files $uri $uri/ =404;
}
}
Nginx 설정파일 수정으로 Redirection 해결하기
위의 구성을 draw.io를 사용해서 간단하게 다이어그램으로 나타내면 아래와 같습니다.
HTTPS와 HTTP로 요청 시 각각의 요청을 받아 Target Group에서 80번 포트로 Nginx로 요청을 보내게 됩니다.
Nginx에서 로드벨런서로부터 들어오는 80 포트를 443으로 다시 리다이렉션을 걸어주면 https로 로드벨런서에 다시 요청을 걸어주어 HTTPS로 통신할 수 있도록 접근을 유도할 수 있습니다.
이는 로드벨런서로 요청한 HTTP / HTTPS 프로토콜을 Nginx에서 식별하여 HTTP 요청일 경우 HTTPS로 전달해주는 방법인데요, 로드벨런서로 요청한 HTTP / HTTPS 프로토콜을 확인하기 위한 Nginx의 변수값인 $http_x_forwarded_proto를 이용하여 처리할 수 있습니다.
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name example.com;
# 아래부분을 추가해주세요~!!
if ($http_x_forwarded_proto = 'http'){
return 301 https://$host$request_uri;
}
}
먼저 $http_x_forwarded_proto를 이용하여 로드벨런서로부터 들어온 프로토콜이 http인지 확인합니다.
이후 http로 들어온 요청이라면 https://호스트/요청 uri 형식으로 https주소로 리다이렉션 합니다.
위와 같이 설정하면 HTTP와 HTTPS일때 모두 HTTPS로 잘 동작하는 웹서버를 구동시킬 수 있습니다. :)
참고
X-FORWARDED-FOR와 X-FORWARDED-PROTO 란
Nginx설정을 통한 https 리다이렉션
'서버 인프라, 백엔드 > 아마존 (AWS)' 카테고리의 다른 글
AWS : EC2 / S3 / CloudFront 트래픽 요금 분석 (2) | 2021.12.13 |
---|---|
AWS : A 레코드와 Cname의 차이 (0) | 2021.12.08 |
AWS : Auto-Scaling과 예약 인스턴스(RI) 사용시 비용 산정 (동시 사용) (2) | 2021.07.01 |
AWS : Route 53 요금 및 비용 산정 (10) | 2021.04.06 |
AWS - EC2 Backup 방법 (snapshot) (2) | 2021.02.12 |