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

[가상 인포그래픽] Nginx 컨테이너 HTTPS 구축 및 Let's Encrypt 인증서 발급 흐름도
3. 실전 구축 로그 (Implementation Log)
이전에 정리한 [Docker 필수 명령어 및 컨테이너 관리] 포스팅을 참고하여 컨테이너를 운용함.
**■ Step 1: Nginx 컨테이너 사전 준비 (HTTP 80) ** 최초 인증서 발급을 위해서는 Let's Encrypt 서버가 내 Nginx 서버의 80포트에 접속할 수 있어야 함.
# 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 ... 명령어 부분.
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) 부분.
# 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) 부분.
# 리눅스 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 리버스 프록시 뒤에 숨길 때 참고.
'Server Story....' 카테고리의 다른 글
| 리눅스 보안 심화: Fail2Ban으로 무차별 대입 공격(Brute Force) 차단하기 (0) | 2026.04.01 |
|---|---|
| Docker-Compose: 복잡한 서버 설정을 코드 한 줄로 관리하기 (0) | 2026.04.01 |
| Ubuntu Server - Docker 설치 및 컨테이너 기초 환경 구축 (0) | 2026.03.31 |
| Ubuntu 24.04 파이썬 가상환경(venv) 완벽 세팅 및 백그라운드 서비스 구축 기록 (0) | 2026.03.30 |
| Ubuntu Server - 필수 패키지 관리(APT) 및 진단 도구 설치 (0) | 2026.03.30 |