Dockerfile로 Nginx와 Django를 함께 사용하는 방법
Dockerfile로 Nginx와 Django를 함께 사용하는 방법
Dockerfile로 Nginx와 Django를 함께 사용하는 방법
Django 애플리케이션을 배포할 때 Nginx는 일반적으로 정적 파일 제공과 리버스 프록시 역할을 수행하는 웹 서버로 자주 사용됩니다. Docker를 이용하면 Django와 Nginx를 컨테이너로 손쉽게 관리할 수 있으며, 개발 환경에서부터 배포 환경까지 일관된 구성을 유지할 수 있습니다. 이번 글에서는 Nginx와 Django를 함께 사용하는 Dockerfile을 작성하고, Docker를 통해 이를 실행하는 방법을 단계별로 설명하겠습니다.
1. 프로젝트 구조 설정
먼저, Django 프로젝트와 Nginx 설정 파일을 포함하는 프로젝트 구조를 설정합니다. 기본적인 디렉터리 구조는 아래와 같습니다.
project-root/
│
├── Dockerfile # Docker 설정 파일
├── docker-compose.yml # Docker Compose 설정 파일
├── nginx/
│ └── default.conf # Nginx 설정 파일
├── django_project/
│ ├── manage.py # Django 관리 파일
│ ├── django_project/
│ ├── ...
└── static/ # 정적 파일 디렉터리
2. Dockerfile 작성
Dockerfile
은 Django 애플리케이션을 실행할 환경과 Nginx를 설정하는 내용을 담고 있습니다. Django 서버는 Gunicorn을 통해 실행하고, Nginx는 리버스 프록시 및 정적 파일을 제공하는 역할을 합니다.
# 1. 베이스 이미지 설정 (Python)
FROM python:3.10-slim
# 2. 작업 디렉터리 설정
WORKDIR /app
# 3. 필수 파일 복사 및 Python 패키지 설치
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 4. Django 프로젝트 복사
COPY . .
# 5. 정적 파일 수집
RUN python manage.py collectstatic --noinput
# 6. Nginx 설치
RUN apt-get update && apt-get install -y nginx
# 7. Nginx 설정 복사
COPY nginx/default.conf /etc/nginx/conf.d/default.conf
# 8. Nginx 포트 개방
EXPOSE 80
# 9. 컨테이너 시작 시 Nginx와 Gunicorn 실행
CMD service nginx start && gunicorn django_project.wsgi:application --bind 0.0.0.0:8000
위 Dockerfile은 Django 프로젝트를 Gunicorn으로 실행하며, Nginx는 정적 파일을 제공하고 Django로의 요청을 프록시 처리합니다.
3. Nginx 설정 파일 작성 (nginx/default.conf
)
Nginx가 리버스 프록시 역할을 하도록 설정하며, Django 애플리케이션에서 제공하는 정적 파일을 관리합니다.
server {
listen 80;
server_name localhost;
# 리버스 프록시 설정
location / {
proxy_pass http://127.0.0.1:8000; # Gunicorn에서 실행 중인 Django로 전달
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 정적 파일 제공
location /static/ {
alias /app/static/;
}
}
위 설정은 /static/
경로로 오는 요청을 정적 파일 디렉터리로 매핑하고, 그 외의 모든 요청은 Django 애플리케이션으로 전달합니다.
4. docker-compose.yml
작성
Docker Compose는 여러 개의 컨테이너를 한 번에 관리할 수 있게 해줍니다. 여기서는 Django 애플리케이션과 Nginx를 정의하여 함께 실행되도록 설정합니다.
version: '3'
services:
web:
build: .
ports:
- "8000:8000" # Gunicorn을 위한 포트 매핑
volumes:
- ./static:/app/static # 정적 파일 디렉터리 마운트
depends_on:
- db
nginx:
image: nginx:latest
ports:
- "80:80" # Nginx 포트 매핑
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf # Nginx 설정 파일 마운트
- ./static:/app/static # 정적 파일 디렉터리 마운트
depends_on:
- web
db:
image: postgres:13
environment:
POSTGRES_DB: mydb
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
web
서비스는 Django를 실행하는 컨테이너로,gunicorn
을 통해 애플리케이션을 실행합니다.nginx
서비스는 Nginx를 사용해 프록시 역할을 수행하며, 정적 파일을 제공하는 컨테이너입니다.db
서비스는 PostgreSQL 데이터베이스를 위한 컨테이너입니다.
5. Django 설정 수정
Django 애플리케이션에서 정적 파일을 제공하기 위해 settings.py
파일에서 정적 파일 경로를 설정해야 합니다.
# settings.py
import os
# 정적 파일 설정
= '/static/'
STATIC_URL = os.path.join(BASE_DIR, 'static')
STATIC_ROOT
# 보안 설정
= ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_PROXY_SSL_HEADER = ['*'] # 실제 배포 시 도메인으로 제한하는 것이 좋습니다. ALLOWED_HOSTS
6. Docker Compose로 컨테이너 실행
모든 설정이 완료되었으면, docker-compose
명령어를 사용하여 컨테이너를 빌드하고 실행합니다.
docker-compose up --build
이 명령어는 Django, Nginx, PostgreSQL 컨테이너를 함께 빌드하고 실행합니다.
7. 브라우저에서 확인
Docker가 실행 중인 상태에서 브라우저를 열고 http://localhost
로 접속하면 Nginx를 통해 Django 애플리케이션이 정상적으로 실행되고 있는 것을 확인할 수 있습니다. Nginx가 프록시 역할을 수행하며, Django가 정적 파일을 제대로 제공하는지 확인합니다.
마무리
Dockerfile과 Docker Compose를 통해 Nginx와 Django를 함께 사용하는 방법을 알아보았습니다. Nginx는 Django 애플리케이션의 리버스 프록시로 작동하며, 정적 파일을 처리하여 효율적인 웹 애플리케이션 배포를 가능하게 합니다. 이 구성은 실제 배포 환경에서 Django 애플리케이션을 안정적이고 확장 가능하게 운영하는 데 큰 도움이 됩니다.
이제 이 기본 구성을 바탕으로 자신의 요구에 맞는 추가적인 설정(예: 보안 설정, 도메인 구성 등)을 적용하여 Docker 환경에서 Django를 배포할 수 있습니다.