Skip to content

도메인 Cloudflare Nginx HTTPS

heopath edited this page Jul 28, 2026 · 1 revision

도메인·Cloudflare·Nginx·HTTPS 설정

1. 적용 구조

도메인은 Spaceship에서 구매하고 DNS와 HTTPS 프록시는 Cloudflare를 사용합니다.

사용자
  → allmytrip.click
  → Cloudflare
  → EC2 Nginx :443
  → Spring Boot 127.0.0.1:8080

2. 도메인과 네임서버

적용 도메인:

allmytrip.click

작업 순서:

  1. Spaceship에서 도메인 구매
  2. Cloudflare에 사이트 추가
  3. Cloudflare가 제공한 네임서버 2개 확인
  4. Spaceship의 기존 네임서버 삭제
  5. Cloudflare 네임서버 2개 등록
  6. DNSSEC가 기존 등록기관에서 켜져 있다면 우선 해제
  7. Cloudflare 상태가 Active가 될 때까지 대기

네임서버 전파에는 수분에서 최대 24시간 정도 걸릴 수 있습니다.

3. DNS 레코드

Type Name Content Proxy
A @ EC2 탄력적 IP Proxied
CNAME www allmytrip.click Proxied

탄력적 IP를 사용하면 EC2를 중지 후 시작해도 도메인의 목적지 IP가 유지됩니다.

4. EC2 보안 그룹

외부 공개 포트:

  • 80: HTTP
  • 443: HTTPS
  • 22: 팀원 또는 관리자 IP /32만 허용

외부에 공개하지 않는 포트:

  • 8080: Spring Boot 내부 포트
  • 5432: PostgreSQL RDS

5. Cloudflare Origin 인증서

Cloudflare에서 Origin 인증서를 생성합니다.

대상 호스트:

allmytrip.click
*.allmytrip.click

EC2 저장 경로 예시:

/etc/nginx/ssl/allmytrip-origin.pem
/etc/nginx/ssl/allmytrip-origin.key

권한:

sudo chmod 644 /etc/nginx/ssl/allmytrip-origin.pem
sudo chmod 600 /etc/nginx/ssl/allmytrip-origin.key

Private Key 내용은 GitHub, Wiki, 블로그, 메신저에 올리지 않습니다.

6. Nginx HTTPS 설정

HTTP는 HTTPS로 이동시키고 HTTPS 요청을 Spring Boot로 전달합니다.

server {
    listen 80;
    listen [::]:80;
    server_name allmytrip.click www.allmytrip.click;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name allmytrip.click www.allmytrip.click;

    ssl_certificate /etc/nginx/ssl/allmytrip-origin.pem;
    ssl_certificate_key /etc/nginx/ssl/allmytrip-origin.key;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;

        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;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;
    }
}

검증:

sudo nginx -t
sudo systemctl reload nginx
sudo ss -lntp | grep -E ':80|:443|:8080'

7. Spring Boot 프록시 설정

Cloudflare와 Nginx가 전달한 HTTPS 정보를 Spring Boot가 인식해야 합니다.

환경값 예시:

SERVER_FORWARD_HEADERS_STRATEGY=framework
SERVER_ADDRESS=127.0.0.1

적용:

sudo systemctl restart all-my-trips

8. Cloudflare SSL/TLS 모드

최종 권장값:

SSL/TLS → Overview → Full (strict)
  • Flexible: Cloudflare에서 EC2까지 HTTP이므로 임시 진단용
  • Full: HTTPS를 사용하지만 원본 인증서를 엄격하게 검사하지 않음
  • Full (strict): EC2 Origin 인증서까지 검증

Origin 인증서를 설치했다면 Full (strict)를 사용합니다.

HTTPS가 정상 작동한 뒤 Always Use HTTPS를 켭니다.

9. 521 오류 해결 기록

521은 브라우저와 Cloudflare 사이가 아니라 Cloudflare가 EC2 원본 서버에 연결하지 못했다는 의미입니다.

이번 구성에서 확인할 항목:

  1. EC2가 실행 중인지 확인
  2. 탄력적 IP가 EC2에 연결되어 있는지 확인
  3. 보안 그룹에서 80과 443 확인
  4. Nginx가 active인지 확인
  5. Nginx가 443에서 대기하는지 확인
  6. Origin 인증서 파일과 권한 확인
  7. nginx -t 확인
  8. Cloudflare를 Full (strict)로 설정
sudo systemctl status nginx --no-pager
sudo nginx -t
sudo ss -lntp | grep -E ':80|:443'

EC2 내부 HTTPS 검사:

curl -kI \
  --resolve allmytrip.click:443:127.0.0.1 \
  https://allmytrip.click/

외부 검사:

curl.exe -I http://allmytrip.click
curl.exe -I https://allmytrip.click
curl.exe -I https://allmytrip.click/home

정상 결과:

  • HTTP는 HTTPS로 301
  • 루트는 /home으로 302
  • /home200
  • Location 헤더가 https:// 사용

10. 오류별 의미

오류 의미 확인
521 Cloudflare가 EC2에 연결 실패 EC2, Nginx, 80/443, 보안 그룹
522 원본 응답 시간 초과 EC2 상태, 방화벽, 네트워크
525 SSL 연결 자체 실패 Nginx TLS 설정과 인증서
526 원본 인증서 검증 실패 Full (strict), 인증서 호스트·유효기간
리다이렉트 반복 HTTP/HTTPS 규칙 충돌 Flexible 해제, forwarded header

11. 완료 기준

  • Cloudflare 상태 Active
  • 루트와 www DNS 레코드 등록
  • 탄력적 IP 연결
  • Origin 인증서 설치
  • Nginx 80·443 active
  • Cloudflare Full (strict)
  • HTTP가 HTTPS로 이동
  • https://allmytrip.click/home이 200
  • 8080 외부 차단

Clone this wiki locally