Docker와 Nginx를 활용한 SSL 적용하기 (Let's Encrypt)

박우진·2025년 3월 23일

Network/Server

목록 보기
9/12

🚀 Docker와 Nginx를 활용한 SSL 적용하기 (Let's Encrypt)

🛠 1. Nginx와 SSL을 활용하는 이유

Nginx의 역할

  • 정적 파일 제공 및 로드 밸런싱 가능
  • 리버스 프록시를 통해 백엔드 서버와 통신 가능

SSL을 적용하는 이유

  • 데이터 암호화를 통해 보안 강화
  • HTTPS 적용으로 신뢰도 상승 및 SEO(Search Engine Optimization, 검색 엔진 최적화) 개선

Docker를 활용하는 이유

  • 호스트 OS에 직접 설치할 필요 없이 컨테이너로 관리 가능
  • 손쉽게 설정 변경 및 배포 가능

🔧 2. Nginx 설정 파일 (nginx.conf)

# user nobody;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    error_log /var/log/nginx/error.log warn;

    sendfile        on;
    keepalive_timeout  65;

    upstream front_proxy {
    	# 도커에 실행되는 서버 IP
        server 172.18.0.3:8080;
    }

    # HTTP -> HTTPS 리디렉션
    server {
        listen       80;
        server_name  tamalog.site www.tamalog.site;

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

    # HTTPS 설정
    server {
        listen       443 ssl;
        server_name  tamalog.site www.tamalog.site;

        # SSL 인증서 설정 (Let's Encrypt)
        ssl_certificate /etc/letsencrypt/live/tamalog.site/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/tamalog.site/privkey.pem;
 
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;

        # SSL 세션 설정
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        # 리버스 프록시 설정 (백엔드로 요청 전달)
        location / {
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header Host $http_host;
            proxy_pass http://front_proxy/;
        }

        # 에러 페이지 설정
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

📌 설정 설명

  • upstream front_proxy: 백엔드 서버(프론트엔드 포함)로 요청을 프록시
  • server 80: HTTP 요청을 HTTPS로 자동 리디렉션
  • server 443: HTTPS 서버 설정
  • ssl_certificate, ssl_certificate_key: Let's Encrypt 인증서 적용
  • proxy_pass http://front_proxy/: 서버(React/Vue 또는 API)로 요청 전달

🐳 3. Docker 컨테이너 실행

위의 Nginx 설정을 적용한 후, Docker를 활용하여 컨테이너를 실행할 수 있습니다.

docker run -d --name nginx-container \
    --network myblog-network \
    -p 80:80 -p 443:443 \
    -v /etc/letsencrypt:/etc/letsencrypt:ro \
    -v ~/config/nginx.conf:/etc/nginx/nginx.conf \
    nginx

📌 옵션 설명

  • -d백그라운드 실행
  • --name nginx-container컨테이너 이름 설정
  • --network myblog-network블로그 관련 서비스와 같은 네트워크 사용
  • -p 80:80 -p 443:443호스트의 80, 443 포트를 컨테이너의 80, 443 포트와 연결
  • -v /etc/letsencrypt:/etc/letsencrypt:roLet's Encrypt SSL 인증서 마운트
  • -v ~/config/nginx.conf:/etc/nginx/nginx.confNginx 설정 파일을 컨테이너에 적용

🔄 4. 설정 변경 후 반영하기

Nginx 설정을 변경한 후, 변경된 설정을 반영하려면 컨테이너 내부의 설정 파일을 업데이트하고 Nginx를 재시작해야 합니다.

🔹 컨테이너 내부 설정 파일 업데이트

docker cp config/nginx.conf nginx-container:/etc/nginx/nginx.conf

위 명령어를 실행하면 로컬의 config/nginx.conf 파일을 컨테이너 내부의 /etc/nginx/nginx.conf 경로로 복사합니다.

🔹 컨테이너 재시작 및 설정 적용

docker restart nginx-container

이제 변경된 설정이 적용된 상태로 Nginx가 다시 실행됩니다.


✅ 5. Let's Encrypt 인증서 발급 (Certbot 사용)

SSL 인증서를 발급받으려면 Certbot을 사용하여 Let's Encrypt에서 인증을 받아야 합니다.
Nginx가 이미 실행 중이라면 아래 명령어를 실행하세요.

sudo certbot certonly --webroot -w /var/www/html -d tamalog.site -d www.tamalog.site

📌 설명

  • certonly → 인증서만 발급 (Nginx 설정 유지)
  • -w /var/www/html → 웹서버 루트 디렉토리 (인증 파일 저장)
  • -d tamalog.site -d www.tamalog.site → 인증서를 적용할 도메인

인증이 완료되면 /etc/letsencrypt/live/tamalog.site/ 경로에 SSL 인증서가 생성됩니다.

자동 갱신 설정 (크론탭 활용)

echo "0 3 * * * certbot renew --quiet" | sudo tee -a /etc/crontab > /dev/null

이렇게 하면 매일 새벽 3시에 SSL 인증서를 자동 갱신합니다.


🎯 6. 배포 및 확인

1️⃣ Nginx 컨테이너 실행

docker restart nginx-container

2️⃣ 도메인에서 HTTPS 접속 테스트
브라우저에서 https://tamalog.site에 접속하여 SSL 적용 여부 확인

3️⃣ SSL 인증서 정상 적용 확인

openssl s_client -connect tamalog.site:443 -servername tamalog.site

0개의 댓글