-
Notifications
You must be signed in to change notification settings - Fork 0
도메인 Cloudflare Nginx HTTPS
heopath edited this page Jul 28, 2026
·
1 revision
도메인은 Spaceship에서 구매하고 DNS와 HTTPS 프록시는 Cloudflare를 사용합니다.
사용자
→ allmytrip.click
→ Cloudflare
→ EC2 Nginx :443
→ Spring Boot 127.0.0.1:8080
적용 도메인:
allmytrip.click
작업 순서:
- Spaceship에서 도메인 구매
- Cloudflare에 사이트 추가
- Cloudflare가 제공한 네임서버 2개 확인
- Spaceship의 기존 네임서버 삭제
- Cloudflare 네임서버 2개 등록
- DNSSEC가 기존 등록기관에서 켜져 있다면 우선 해제
- Cloudflare 상태가
Active가 될 때까지 대기
네임서버 전파에는 수분에서 최대 24시간 정도 걸릴 수 있습니다.
| Type | Name | Content | Proxy |
|---|---|---|---|
| A | @ |
EC2 탄력적 IP | Proxied |
| CNAME | www |
allmytrip.click |
Proxied |
탄력적 IP를 사용하면 EC2를 중지 후 시작해도 도메인의 목적지 IP가 유지됩니다.
외부 공개 포트:
- 80: HTTP
- 443: HTTPS
- 22: 팀원 또는 관리자 IP
/32만 허용
외부에 공개하지 않는 포트:
- 8080: Spring Boot 내부 포트
- 5432: PostgreSQL RDS
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.keyPrivate Key 내용은 GitHub, Wiki, 블로그, 메신저에 올리지 않습니다.
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'Cloudflare와 Nginx가 전달한 HTTPS 정보를 Spring Boot가 인식해야 합니다.
환경값 예시:
SERVER_FORWARD_HEADERS_STRATEGY=framework
SERVER_ADDRESS=127.0.0.1적용:
sudo systemctl restart all-my-trips최종 권장값:
SSL/TLS → Overview → Full (strict)
-
Flexible: Cloudflare에서 EC2까지 HTTP이므로 임시 진단용 -
Full: HTTPS를 사용하지만 원본 인증서를 엄격하게 검사하지 않음 -
Full (strict): EC2 Origin 인증서까지 검증
Origin 인증서를 설치했다면 Full (strict)를 사용합니다.
HTTPS가 정상 작동한 뒤 Always Use HTTPS를 켭니다.
521은 브라우저와 Cloudflare 사이가 아니라 Cloudflare가 EC2 원본 서버에 연결하지 못했다는 의미입니다.
이번 구성에서 확인할 항목:
- EC2가 실행 중인지 확인
- 탄력적 IP가 EC2에 연결되어 있는지 확인
- 보안 그룹에서 80과 443 확인
- Nginx가 active인지 확인
- Nginx가 443에서 대기하는지 확인
- Origin 인증서 파일과 권한 확인
-
nginx -t확인 - 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 -
/home은200 -
Location헤더가https://사용
| 오류 | 의미 | 확인 |
|---|---|---|
| 521 | Cloudflare가 EC2에 연결 실패 | EC2, Nginx, 80/443, 보안 그룹 |
| 522 | 원본 응답 시간 초과 | EC2 상태, 방화벽, 네트워크 |
| 525 | SSL 연결 자체 실패 | Nginx TLS 설정과 인증서 |
| 526 | 원본 인증서 검증 실패 | Full (strict), 인증서 호스트·유효기간 |
| 리다이렉트 반복 | HTTP/HTTPS 규칙 충돌 | Flexible 해제, forwarded header |
- Cloudflare 상태 Active
- 루트와
wwwDNS 레코드 등록 - 탄력적 IP 연결
- Origin 인증서 설치
- Nginx 80·443 active
- Cloudflare Full (strict)
- HTTP가 HTTPS로 이동
-
https://allmytrip.click/home이 200 - 8080 외부 차단