본문 바로가기

Server Story....

Ubuntu Server - Nginx 컨테이너 HTTPS(SSL) 적용 및 Let's Encrypt 자동 갱신

반응형

1. 도입 및 배경

  • 서버 운영의 기본은 보안이며, 모든 웹 서비스는 HTTP(80)가 아닌 **HTTPS(443)**로 서비스되어야 함.
  • Docker 환경에서 Nginx를 리버스 프록시로 사용할 때, 무료 SSL 인증서 기관인 Let's Encrypt를 활용하여 인증서를 발급받고 자동 갱신하는 과정을 기록함.
  • 윈도우 서버 IIS의 SSL 인증서 등록 방식과 비교해 볼 때, 리눅스 Docker 환경은 스크립트 기반으로 훨씬 유연한 자동화가 가능함.

2. Nginx 컨테이너 HTTPS 구조도 (인포그래픽)


Nginx 컨테이너 HTTPS 구조도 (인포그래픽)


[가상 인포그래픽] Nginx 컨테이너 HTTPS 구축 및 Let's Encrypt 인증서 발급 흐름도

 


3. 실전 구축 로그 (Implementation Log)

이전에 정리한 [Docker 필수 명령어 및 컨테이너 관리] 포스팅을 참고하여 컨테이너를 운용함.

**■ Step 1: Nginx 컨테이너 사전 준비 (HTTP 80) ** 최초 인증서 발급을 위해서는 Let's Encrypt 서버가 내 Nginx 서버의 80포트에 접속할 수 있어야 함.

YAML
 
# Docker-Compose.yml 활용 (또는 docker run)
version: '3'
services:
  nginx:
    image: nginx:latest
    container_name: nginx_proxy
    ports:
      - "80:80"   # 최초 발급용
      - "443:443" # 보안 서비스용
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./certbot/conf:/etc/letsencrypt  # 인증서 저장소
      - ./certbot/www:/var/www/certbot   # ACME 웹 루트

■ Step 2: Certbot 컨테이너 활용 인증서 발급 위 인포그래픽 **'Left Zone'**의 docker run certbot/certbot ... 명령어 부분.

Bash
 
docker run -it --rm \
  -v ./certbot/conf:/etc/letsencrypt \
  -v ./certbot/www:/var/www/certbot \
  certbot/certbot certonly --webroot -w /var/www/certbot -d suminstory.net

[메모] suminstory.net은 사용자님의 도메인으로 대체해서 사용할 것. 이 과정에서 Let's Encrypt 서버가 내 80포트에 ACME Challenge를 수행함.

■ Step 3: Nginx SSL 설정 및 HTTPS 리다이렉트 인포그래픽 속 'Center''Right Zone' (HTTP --> HTTPS REDIRECT) 부분.

Bash
 
# nginx.conf 수정
server {
    listen 80;
    server_name suminstory.net;
    return 301 https://$host$request_uri; # HTTP를 HTTPS로 리다이렉트
}

server {
    listen 443 ssl; # 보안 포트
    server_name suminstory.net;

    ssl_certificate /etc/letsencrypt/live/suminstory.net/fullchain.pem; # 인증서
    ssl_certificate_key /etc/letsencrypt/live/suminstory.net/privkey.pem; # 키
}

4. 자동 갱신 (Renewal)

Let's Encrypt 인증서는 만료 기간이 90일이므로 자동으로 갱신해 줘야 함. 인포그래픽 속 'Bottom' (CRONTAB RENEWAL) 부분.

Bash
 
# 리눅스 Crontab에 등록 (매월 1일 새벽 2시)
0 2 1 * * docker run -it --rm -v ./certbot/conf:/etc/letsencrypt -v ./certbot/www:/var/www/certbot certbot/certbot renew && docker restart nginx_proxy

5. 트러블슈팅 및 메모 (Troubleshooting)

Q1. certbot 발급 중 "Connection refused" 에러

  • 원인: Let's Encrypt 서버가 내 Nginx의 80포트에 접속 못 함.
  • 해결: 방화벽(UFW)에서 80포트가 열려 있는지 확인하고, **[SSH 포트 변경 기록]**에서 다뤘던 netstat -plnt로 80포트 리스닝 상태를 체크할 것.

Q2. 브라우저에서 "안전하지 않은 사이트" 경고

  • 인증서 파일 경로나 파일 자체에 문제가 있는 것임. 인포그래픽 속 shield 아이콘이 깨진 상태. docker restart nginx_proxy로 재시작 후 docker logs로 Nginx 에러를 확인할 것.

6. 관련 기록 (Cross-References)

  • [Ubuntu Server - Docker 필수 명령어 및 컨테이너 관리]: Docker 명령어 복습용.
  • [Windows Server 2022 MSSQL Express 설치]: 나중에 이 MSSQL 포트(1433)도 Nginx 리버스 프록시 뒤에 숨길 때 참고.
반응형