목록으로

Cloudflare + Nginx 배포

약 5분 읽기Development#Development댓글로 이동

nextjs docker cloudflare

main
date
Sep 17, 2025
slug
delpoy-cloudflare-nginx
author
status
Public
tags
Development
summary
nextjs docker cloudflare
type
Post
thumbnail
category
Development
updatedAt
Apr 14, 2026 09:44 PM
급하게 만든 어드민 사이트를 우선 배포하기로 했다.
원래는 다음 주 미팅 전까지 기능을 마무리한 뒤, 미팅 자리에서 링크를 공개하는 계획이었는데, 구현을 진행하다 보니 자꾸만 새로운 기능 아이디어가 떠올라 개발 범위가 계속 늘어나는 상황이 되었다.
결국 일정 지연을 막기 위해 프로젝트를 일단 배포한 뒤 지속적으로 Iteration을 돌리는 방식으로 전략을 바꿔 부랴부랴 배포 준비를 하게 되었다.
 
아무래도 어드민에 대한 뚜렷한 기획이 있는 것도 아니고 그냥 내가 필요하다 생각하는 기능들을 넣는 것이다 보니 개발을 진행하면 할 수록 필요한 기능들이 계속 생각이 나는 상황.. 그렇기 때문에 우선 프로젝트를 배포해두고 디벨롭 하는 식으로 변경하여 부랴부랴 프로젝트 배포 준비를 하게 되었다.
 
현재 인프라 구성은 다음과 같다.
  • DNS 서버: Cloudflare
  • 이미지 레지스트리: AWS ECR (Elastic Container Registry)
  • 컨테이너 런타임: Docker
  • 웹 서버(Reverse Proxy): Nginx
 
배포 과정은 크게 다음 순서로 진행했다.
  1. ECR에 해당 프로젝트의 Private Repository를 생성하고, gitlab CI/CD 파이프라인을 통해 Docker Image를 Build & Push.
  1. Cloudflare DNS에 어드민 도메인을 A Record로 등록하고, Proxy 모드를 활성화.
  1. docker-compose 기반의 배포 스크립트를 작성해 애플리케이션 컨테이너를 실행.
  1. 최종적으로 Nginx에서 Reverse Proxy + SSL Termination 설정을 적용하여 외부 요청을 컨테이너로 전달.
    1. SSL Termination
      데이터 트래픽이 암호화 및 암호화되지 않을 때의 전환 프로세스를 의미한다. SSL (Secure Socket Layer) 연결의 서버 측에서 발생한다.
       
      notion image
      SSL Termination이란?
      • SSL로 암호화된 데이터 트래픽이 해독 (또는 오프로드) 되는 프로세스
      • SSL (Secure Socket Layer) 연결이 있는 서버는 많은 연결 또는 세션을 동시에 처리할 수 있음
      • SSL 연결은 인증용 인증서를 사용하여 최종 사용자의 컴퓨터와 웹 서버간의 암호화된 데이터를 주고 받는다.
      • SSL Termination은 암호 해독 프로세스의 속도를 높이고 백엔드 서버의 처리 부답을 줄인다.
 
우리는 DNS 서버로 클라우드플레어를 사용하고 도커 컨테이너는 ECR를 사용하고 있다. 웹서버로는 Nginx를 띄워서 사용하고 있다.
 
ECR에 해당 프로젝트의 레포지토리를 생성해주고, 클라우드플레어에 해당 도메인을 A 유형으로 입력해주고, 배포를 위한 도커 스크립트를 작성하였다. 그리고 배포할 서버의 Nginx Sever block을 변경하는데 웬걸.. 리다이렉트가 미친듯이 되면서 사이트가 안켜짐… 근데 서버 아이피로 접근하면 된다.
 
원인은 Cloudflare의 Flexible SSL 모드 + Nginx HTTPS 리다이렉션 규칙이 충돌하면서, http → https → http 로 리다이렉트하는 과정이 무한 반복되는 상황이었다.
 
당연히 80 포트와 443포트에 대해 Nginx server block을 설정하였는데 클라우드플레어에서 저렇게 처리하고 있는줄은 몰랐다.
(하루 꼬박 걸려서 해결하긴 했는데.. 진짜 오랜만에 삽질)
 

Cloudflare는 뭘할까..?

 
Cloudflare는 DNS 서버로 동작하여 클라이언트의 웹사이트 접속 요청을 받는다. 이 때 HTTPS로 접속할 경우에는 Cloudflare에서 SSL 인증을 수행하고 Client와 Cloudflare 간의 트래픽은 암호화하여 송수신한다.
  • 프록싱 활성화
    • Client가 도메인으로 접속하면, Cloudflare를 통해 요청이 프록싱되어 웹서버로 전달된다. Cloudflare의 보안, 캐싱, DDoS 방어 기능을 사용할 수 있다.
  • 프록싱 비활성화
    • Client는 Cloudflare를 거치지 않고 직접 웹 서버에 연결된다. 이 경우 웹 서버 자체에서 보안 작업을 해야한다.
 

Cloudflare의 Flexible SSL 모드는 뭘까?

CloudFlare는 Client ↔ Cloudfalre ↔ Origin Server 사이 SSL/TLS 연결 방식을 어떻게 할지 선택할 수 있는 옵션을 제공한다. 대표적으로 Flexible, Full, Full (Strict)
 
Full SSL 모드
  • 클라이언트 → Cloudflare: HTTPS
  • Cloudflare → 원본 서버: HTTPS (자체 서명 인증서도 OK)
  • 서버에 인증서가 필요하지만, 유효하지 않은 Self-signed 인증서도 허용
 
Full (Strict) SSL 모드
  • 클라이언트 → Cloudflare: HTTPS
  • Cloudflare → 원본 서버: HTTPS (정식 인증기관에서 발급받은 유효한 인증서 필요)
  • 가장 안전한 모드 (양쪽 구간 모두 유효한 HTTPS 보장)
 
Flexible SSL 모드
  • Client ↔ Cloudflare 구간만 HTTPS 연결
  • Cloudflare → Origin Server 는 HTTP 연결
→ 즉, 서버에 SSL 인증서가 없어도 Cloudflare가 대신 HTTPS를 제공해주는 방식 (그래서 origin server 인증서 기간은 1년, 클플 인증서는 3개월로 인증서 기간이 달랐던 것)
 
notion image
 
오늘 백엔드 담당인 팀원한테 듣기로는 몇 달 전 flexible로 바꿨는데 바꾼 이유가 보안적으로 좀 더 좋다고 해서 바꿨다고 하는데 잉..?? 찾아보는 레퍼런스들은 보안적으로 취약하여 쓰지말라고하는데 뭐지
→ 이상해서 다시 물어보니 파일 서버 고속화(?) 아무튼.. 그런 이슈로 해둔 것 이라고 한다.