이전 글에서는 GitHub Actions를 이용해 CI/CD 파이프라인을 구축했습니다. 이번 글에서는 Nginx 리버스 프록시를 도입하고, Certbot을 이용해 무료 SSL 인증서를 발급받아 HTTPS를 적용하는 전체 과정을 정리합니다.

전체 흐름 개요

    alt text

1. 아키텍처 개요

HTTPS 적용 아키텍처

기존에는 사용자가 Docker 컨테이너의 포트로 직접 접근했지만, 이제는 중간에 Nginx를 둔 리버스 프록시(Reverse Proxy) 구조로 변경합니다.

구성요소 역할 분담

  • 사용자: https://shopsphere123.duckdns.org로 접속 (443 포트)

  • Nginx: SSL 처리 및 리버스 프록시 역할 (443 → 8080)

  • Spring Boot 앱 (Docker 컨테이너): HTTP 요청(8080) 처리 전담


2. HTTPS 적용을 위한 사전 준비

2-1. 무료 도메인 설정 (DuckDNS)

  1. https://www.duckdns.org/ 접속

  2. GitHub 계정 등으로 로그인

  3. 원하는 서브도메인 등록 (예: shopsphere123)

  4. EC2의 공인 IP를 입력한 뒤 update ip 클릭

  5. IP 자동 갱신을 위한 cron 등록:

mkdir -p ~/duckdns

# DuckDNS 갱신 스크립트 생성
echo 'echo url="https://www.duckdns.org/update?domains=shopsphere123&token=YOUR_TOKEN&ip=" | curl -k -o ~/duckdns/duck.log -K -' > ~/duckdns/duck.sh

chmod 700 ~/duckdns/duck.sh

crontab -e
# 아래 내용 추가
*/5 * * * * ~/duckdns/duck.sh

2-2. AWS 보안 그룹(방화벽) 설정

유형 프로토콜 포트 범위 소스 설명
HTTP TCP 80 0.0.0.0/0 일반 웹 접속 및 Certbot 인증용
HTTPS TCP 443 0.0.0.0/0 보안 웹 접속용
SSH TCP 22 내 IP (권장) EC2 접속용
ICMP ICMP 전체 0.0.0.0/0 Ping 테스트용

EC2 콘솔 → 인스턴스 → 보안 탭 → 보안 그룹 클릭 → 인바운드 규칙 편집


3. Nginx 및 Certbot 설치

3-1. Nginx 설치 및 실행 확인

sudo apt-get update
sudo apt-get install nginx -y
sudo systemctl status nginx
  • 브라우저에서 http://shopsphere123.duckdns.org 접속 → “Welcome to nginx!” 페이지 확인

3-2. Certbot 설치 (Let’s Encrypt)

sudo snap install core; sudo snap refresh core
sudo apt-get remove certbot
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

4. Nginx와 Certbot 연동하여 HTTPS 적용

4-1. Nginx 설정 파일 수정

sudo nano /etc/nginx/sites-available/default
  • server_name _;server_name shopsphere123.duckdns.org;로 변경

  • 저장 후 문법 확인 및 재시작

sudo nginx -t
sudo systemctl restart nginx

4-2. Certbot 실행

sudo certbot --nginx
  • 이메일 입력, 약관 동의(Y)

  • 리디렉션 여부: 2번 (Redirect) 선택

  • 성공 시: “Congratulations!” 메시지 출력 → HTTPS 적용 완료


5. Nginx 리버스 프록시 설정

sudo nano /etc/nginx/sites-enabled/default

location / 블록을 다음과 같이 수정:

location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}
  • 저장 후 문법 검사 및 재시작
sudo nginx -t
sudo systemctl restart nginx

최종 확인

  • 사용자는 https://shopsphere123.duckdns.org로 안전하게 접속 가능

  • Nginx는 SSL 처리 및 리버스 프록시 역할

  • 내부 Spring Boot 애플리케이션은 기존처럼 8080 포트에서 동작

  • CI/CD 파이프라인은 여전히 app.jar을 EC2로 전송 및 실행