
이 글에서는 Docker 환경에서 Nginx 컨테이너를 통해 SSL을 적용하고,
`localhost:8000` 에서 동작 중인 백엔드 서버와 연결하는 방법을 소개합니다.
🧱 1. 프로젝트 디렉토리 구조
my-nginx-setup/
├── docker-compose.yml
├── nginx/
│ ├── nginx.conf # Nginx Configuration
│ └── ssl/
│ ├── cert.pem # SSL 인증서
│ └── privkey.pem # SSL 키
└── log/ # Log 저장
- 프로젝트 디렉토리를 하나 만듭니다.
- `docker-compose.yml` 파일을 통해 설정합니다.
- 볼륨 마운트를 할 `nginx` 및 `log` 디렉토리를 만듭니다.
- `nginx/ssl` 경로에는 설정할 SSL 인증서/키 파일을 세팅합니다.
🐳 2. docker-compose.yml
services:
nginx:
image: nginx:latest
container_name: nginx
network_mode: "host"
volumes:
- ./nginx:/etc/nginx
- ./log:/var/log/nginx
restart: always
- `network_mode=host` 로 설정하여, Nginx가 `localhost` 에 접근할 수 있도록 합니다.
- 로컬의 `nginx` 디렉토리와 `log` 디렉토리를 컨테이너 내부 각 영역과 볼륨 마운트 합니다.
⚙️ 3. Nginx 설정파일: nginx/nginx.conf
events {
worker_connections 1024;
}
http {
# Default: 404
server {
listen 443 ssl default_server;
server_name _;
ssl_certificate /etc/nginx/ssl/your_all_cert.pem;
ssl_certificate_key /etc/nginx/ssl/your_key.pem;
return 404;
}
# To Backend
server {
listen 443 ssl;
server_name your.domain.io;
ssl_certificate /etc/nginx/ssl/your_all_cert.pem;
ssl_certificate_key /etc/nginx/ssl/your_key.pem;
location / {
proxy_pass http://localhost:8000;
}
}
# Redirect to 443
server {
listen 80;
server_name your.domain.io;
return 301 https://$host$request_uri;
}
}
Linux(Ubuntu) 환경에서는 로컬호스트(localhost)에 접근하기 위해 `network_mode`를 설정하여 접근할 수 있습니다. 반면, Mac 등의 기타 OS에서는 `host.docker.internal` 값을 통해 로컬호스트 및 기타 컨테이너에 접근할 수 있게 됩니다.
위는 `nginx.conf` 파일의 예시입니다. 필요한 구성 및 환경설정에 따라 다른 값들을 입력해야 합니다.
🔒 4. SSL 인증서 준비
인증서는 다음과 같은 방식들로 준비할 수 있습니다.
(1) 테스트용 Self-signed 인증서 생성
mkdir -p nginx/ssl
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout nginx/ssl/privkey.pem \
-out nginx/ssl/cert.pem \
-subj "/CN=your.domain.io"
이 인증서는 브라우저에서 신뢰되지 않음 경고가 뜰 수 있습니다.
(2) Let's Encrypt로 실제 인증서 발급
도메인이 실제로 존재해야 하며, `certbot` 등으로 발급할 수 있습니다. 아래 글을 참조하세요!
가비아 & letsencrypt & Nginx 로 개인서버에 도메인 붙여보기
개요최근에 구하게 된 PC를 개인서버로 만들어서 이것저것 개발하다보니, 도메인을 붙이고 싶다는 생각이 들었다.원래 AWS를 이용해서는, Route 53에서 도메인을 구매하고, SSL을 먹이기 위해서 ACM
ts01.tistory.com
혹시 인증서 갱신을 원한다면, 아래 글을 참조하세요.
Let's Encrypt 의 이미 만료된 인증서를 갱신하기
✅ 개요HTTPS 를 위한 무료 SSL 인증서 발급 서비스인 Let's Encrypt 는 일반적으로 90일의 유효기간을 제공합니다. 보통은 자동 갱신을 설정해 두지만, 가끔 예상치 못하게 인증서가 만료된 후 이를 갱
ts01.tistory.com
(3) 실제 인증서 구매 및 발급
SecureSign 등의 다양한 사이트에서 SSL 인증서를 구매하고 발급할 수 있습니다.
🚀 5. 컨테이너 실행
docker compose up -d
# 강제 재실행
docker compose up -d --force-recreate
🏁 마무리
SSL 등록이 완료되고 서버도 올바르게 실행되어 있다고 가정한다면, 설정한 도메인을 통해 접속할 수 있습니다. 정상적으로 연결되었다면, Nginx 컨테이너가 요청을 수립하고, SSL 처리하여, `localhost:8000` 백엔드로 요청이 프록시됩니다.
누적되는 Nginx 로그는 아래 경로에서 확인 가능합니다:
- 일반 로그: `./log/access.log`
- 에러 로그: `./log/error.log`
이렇게 설정하면 Nginx가 SSL 터미네이션을 담당하면서, Docker 내부에서 외부 요청을 안전하게 백엔드로 전달할 수 있습니다. 실서비스에 적용할 경우 로드밸런싱, CORS 설정, 리버스 프록시 보안 헤더 등 추가 구성도 고려할 수 있습니다.
감사합니다.
'💻 나는 개발자다 > 🐳 Docker' 카테고리의 다른 글
| Postgres 데이터베이스 실행하기 (0) | 2025.03.05 |
|---|---|
| Zsh에서 Docker 명령어 자동완성하기 (4) | 2023.07.19 |
| Docker in Ubuntu 18.04 (0) | 2023.07.03 |