[AWS] Nginx 와 Let's Encrypt로 https 설정하기

이진경·2025년 5월 28일

AWS

목록 보기
2/3
post-thumbnail

0. 사전 준비물

  • 가비아에서 구매한 도메인

1. Route 53에 도메인 연결

이전 포스팅에서 http://3.36.34.232:8080/swagger-ui/index.html# 와 같이 날것의 URL로 접속 해보고 마무리가 되었는데, 이번에는 https로 설정해주면서 도메인까지 적용해보도록 할것이다.

Q1. 날것의 URL에서 https만 적용하면 안되나요?
-> 안된다. https는 SSL/TLS 인증서 기반의 암호화를 사용하는데, 이 인증서는 도메인(domain name)에 발급되는 것이지, IP 주소에 발급되지 않기 때문이다.

Q2. 왜 IP에는 인증서를 못받나요?
-> Let's Encrypt, DigiCert, GlobalSign 등 주요 인증기관(CA)은 도메인 소유권을 확인한 뒤에만 인증서를 발급합니다. IP 주소는 소유권을 증명하기 어렵기 때문에 인증서를 발급해주지 않습니다.

1-1. Route 53에 호스팅 영역 생성

호스팅 영역 체크

도메인 이름에 가비아에서 구매한 도메인 이름 넣기

호스팅 영역 생성 완

호스팅 영역에 들어오면 이미 2개의 레코드가 생성되어있다.
NS도메인을 등록한 등록기관(예: 가비아) 에 설정해줘야 해당 도메인 질의가 Route 53으로 위임됩니다.
SOA는 도메인의 기본 정보와 권한을 가진 DNS 서버에 대한 정보를 포함합니다.
포함 정보:

  • 권한을 가진 네임서버(NS) 주소
  • 관리자 이메일 주소
  • 시리얼 번호 (변경 시 증가)
  • 캐시 TTL, 재시도 시간 등 DNS 운영 관련 값들
    보통은 SOA 레코드를 직접 수정하지 않으며, Route 53에서 자동 관리됩니다.

A는 도메인 이름을 IPv4 주소로 연결해주는 DNS(Domain Name System) 레코드입니다. 예를 들어서 api.ellieworld.shop을 3.36.34.232로 바꿔주는겁니다.

1-2. 가비아에 네임서버 등록

도메인을 가비아에서 발급받았기때문에 Route53의 호스팅영역의 NS코드를 가비아의 네임서버에 등록시킵니다.


이 값을

이렇게 셋팅해주고 셋팅해줄때 뒤에 .은뺍니다.

1-3. 생성된 호스팅 영역에 EC2 연결

api.ellieworld.shop 레코드 추가

레코드 유형은 A, 값은 EC2의 public IP

nginx를 80번 포트로 실행할것이라 보안그룹의 인바운드 규칙에 80번을 열어줍니다.

IPv4와 IPv6 규칙을 둘다 추가해주어야 합니다.

Q. 왜 그렇게 해야하나요?
-> AWS 보안 그룹이 각 IP 프로토콜 버전에 대해 별도로 규칙을 처리하기 때문입니다. 하나의 규칙에 0.0.0.0/0(IPv4)와 ::/0(IPv6)을 같이 넣을 수 없습니다.

1-4. nginx 리버스 프록시 서버 설정

서버에 접속해서 nginx를 설치 해줍니다.

$ sudo apt install nginx

/etc/nginx/sites-available 이 위치에 가면 default파일이 있는데 이 파일을 수정해야합니다.

$ sudo vi /etc/nginx/sites-available/default

vi를 해서 안에 내용을 보면 뭔가 엄청많습니다. 그렇지만 하나씩 수정해보도록 하겠습니다.

upstream dev-api-server {
	server 3.36.34.232:8080;
}

위코드를 server{} 상단에 추가해줍니다. 물론 저 ip는 ec2 public ip입니다.

그리고 80포트 옆 default_server변수를 지워줍니다.

그리고 아래로 내려가서 location{} 을 찾습니다.

location변수 위에 server_name이 있는데 여기에 api 도메인을 적습니다. 저는 api.elieworld.shop입니다. 가비아에서 500원주고 샀습니다.

그리고 location{} 내부에 proxy정보들을 넣어줍니다.

root /var/www/html;
줄부터 index index.html... 요 줄도 삭제해줍니다.

최종적으로 이렇게만 수정하면 됩니다.

✅ 이 작업의 의미:
api.ellieworld.shop으로 들어오는 요청을 받아서
실제로는 http://3.36.34.232:8080 (즉, 백엔드 서버)로 전달
그리고 결과를 다시 클라이언트에게 응답
👉 이게 바로 리버스 프록시 역할

default파일을 저장하고 여기서 /etc/nginx 경로로 가서 폴더 리스트를 보면

sites-available, sites-enabled가 있죠 방금 제가 수정한 파일은
sites-available/default 입니다. 이미 심볼릭 링크가 sites-enabled에 있을겁니다.

심볼릭 링크는 windows의 바로가기와 비슷한 개념입니다. enabled한 사이트의 conf파일을 지정해주는거죠.
Nginx는 sites-enabled/ 안의 설정 파일만 읽기 때문에,
실제 설정은 sites-available/에 두고,
쓸 설정만 링크로 연결해주는 방식입니다.

원래는 default를 쓰지않고 커스텀 해서 사용하겠다 하면 저 심볼릭 링크를 연결해주어야 합니다.

새로 conf를 만든 후에 심볼릭 링크 연결 CLI

sudo ln -s /etc/nginx/sites-available/new_setting.conf /etc/nginx/sites-enabled/

구성이 잘 되었는지 테스트 해봅시다.

$ sudo nginx -t

nginx 재시작을 합니다.

$ sudo systemctl restart nginx

nginx가 다시 켜졌는지 확인합니다.

$ systemctl status nginx.service

1-5. Let's Encrypt 인증서 발급받기

certbot을 설치합니다
✅ Let's Encrypt: 무료 인증서를 발급해주는 인증 기관(CA)
✅ Certbot: Let's Encrypt와 통신하여 인증서를 신청, 갱신, 설치하는 프로그램(도구)

$ sudo apt install certbot python3-certbot-nginx -

발급받기전에 Route53 > api도메인 A레코드로 등록해놓았는지 체크

https인증서를 발급받습니다.

sudo certbot --nginx -d api.ellieworld.shop

email을 적을때는 aws로그인 계정을 적습니다.

그러면

발급받은 인증서 위치

/etc/letsencrypt/live

원하는 url이 나왔네요 👏 https://api.ellieworld.shop/swagger-ui/index.html#

profile
기록남기기

0개의 댓글