코드 저장소.

서브도메인(API) 기반 Nginx HTTPS 적용 with Docker + Certbot 본문

DevOps/Docker

서브도메인(API) 기반 Nginx HTTPS 적용 with Docker + Certbot

slown 2025. 6. 10. 01:25

목차 

1.목표

2.사전구성

3.설정 구성

4.인증서  발급 과정

5.이후  과정

6. 추가적인 팁

 

1.목표 

  • 메인 도메인: schedulemanagement.site → Vercel에서 프론트 호스팅
  • API 서브도메인: api.schedulemanagement.site → Lightsail에서 백엔드 운영 (Spring Boot + Nginx)
  • HTTPS 기반으로 보안 통신 적용
  • Docker 기반으로 전체 인프라 구성

2. 사전 구성

  • 도메인: 가비아에서 구매
  • DNS는 AWS Route 53 사용 중
  • Route 53에서 api.schedulemanagement.site → Lightsail 퍼블릭 IP로 A 레코드 등록
  • Nginx, Spring Boot, Kafka 등은 Docker Compose로 관리
  • 인증서는 Certbot + Docker 방식으로 발급

3. 설정 구성

schedule-app/ 
├── certbot/ │ 
├── conf/ # 인증서 저장 위치 (마운트됨) │
└── www/ # 인증 파일 경로 (webroot) 
├── nginx/ │ 
└── nginx.conf # nginx 설정 
└── docker-compose.dev.yml

 

Docker-Compose.dev.yml 에서 Nginx와 cerbot의 구성 내용

services: 
	nginx: 
    	image: nginx:alpine 
    	ports:
    		- "80:80" - "443:443" 
    	volumes: 
    		- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro 
        	- ./certbot/conf:/etc/letsencrypt 
        	- ./certbot/www:/var/www/certbot 
    	depends_on: 
    		- backend 
    certbot: 
    	image: certbot/certbot 
        volumes: 
        	- ./certbot/conf:/etc/letsencrypt 
            - ./certbot/www:/var/www/certbot 
        entrypoint: "/bin/sh -c 'trap exit TERM; while :; do sleep 6h & wait $${!}; certbot renew; done'"

 

nginx.conf 설정

 

 

 
server { 
	listen 80; 
    server_name api.schedulemanagement.site; 
    
    location /.well-known/acme-challenge/ { 
        root /var/www/certbot; 
    } 
    
    location / { 
    	return 301 https://$host$request_uri; 
    } 
} 

# 인증서 발급 후 아래 블록 주석 해제 
server { 
	listen 443 ssl; 
    server_name api.schedulemanagement.site; 
    ssl_certificate /etc/letsencrypt/live/api.schedulemanagement.site/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/api.schedulemanagement.site/privkey.pem; 
    
    location /api/ { proxy_pass http://backend:8082/api/; ... } 
}

4. 인증서 발급 순서

4-1. HTTPS 블록은 주석 처리

# server { # listen 443 ssl; # ... # }
4-2. 도커 컴포즈로 Nginx 실행
 
 
docker compose up -d
 
4-3. well-known 접근 테스트 
 
 
mkdir -p ./certbot/www/.well-known/acme-challenge echo "test-ok" > ./certbot/www/.well-known/acme-challenge/test.txt curl http://api.schedulemanagement.site/.well-known/acme-challenge/test.txt # → "test-ok" 응답 확인
 
4-4. 인증서 발급(docker cerbot)
docker run
     --rm \ -v $(pwd)/certbot/conf:/etc/letsencrypt \
     -v $(pwd)/certbot/www:/var/www/certbot \ certbot/certbot certonly \
     --webroot \ --webroot-path=/var/www/certbot \
     -d api.schedulemanagement.site \
     --email your@email.com \
     --agree-tos \ --no-eff-email

5. 이후 작업

  • 인증서 발급 성공 후 nginx.conf에서 HTTPS 블록 주석 해제
  • Nginx 다시 실행:
docker compose restart nginx
  • HTTPS 정상 작동 확인:

6. 기타 팁

  • certbot은 renew 주기적 실행 중 (entrypoint로 설정)
  • 필요 시 nginx -t → 설정 테스트 후 reload
  • Route 53에 A 레코드 등록되어 있어야 DNS 인증 통과됨

'DevOps > Docker' 카테고리의 다른 글

Docker  (0) 2024.09.05
도커 컴포즈 사용법  (0) 2024.06.23
docker -access denied for user 'root'@'localhost' (using password: yes) 에러  (0) 2024.05.15