본문 바로가기
개발/웹

Django 커머스 보일러플레이트 - (4) Nginx 웹 서버와 도커 컴포즈, AWS ECS 배포

by pandatta 2023. 5. 3.

Django 커머스 보일러플레이트 시리즈

(1) 프로젝트 요구사항과 다이어그램 모델링
(2) 장고/DRF 모델, 시리얼라이저, 뷰
(3) 유닛 테스트, drf-yasg API 문서화
(4) Nginx 웹 서버와 도커 컴포즈, AWS ECS 배포
(5) GitHub Actions CI/CD

안녕하세요, 판다타입니다.

한동안 파이썬 웹 프레임워크 삼대장 플라스크(Flask), 장고(Django), 패스트API(FastAPI) 중, 회사에서는 사용하지 않는 장고를 이용해 e-커머스(e-commerce) 제작에 사용할 수 있는 보일러플레이트(boilerplate)를 만들어보았습니다. 진행한지는 꽤 되어서 한꺼번에 몰아서 작성하다보니 자세한 설명을 하기는 어렵고... 여러분의 장고 프로젝트 작성에 도움이 될까 하여 간단하게 몇 가지를 정리해보았습니다. 자세한 소스코드는 Djarf GitHub 저장소를 참고해주시고, 궁금한 점은 댓글이나 메일로 문의해주세요.

Requirements.txt: 도커(Docker) 컨테이너 안에서 편리한 파이썬 라이브러리 설치를 위한 설정 파일

# requirements.txt
Django>=4.1.7
djangorestframework>=3.14.0
drf-yasg>=1.21.5
gunicorn>=20.1.0
httpie>=3.2.1
mysqlclient>=2.1.1

Nginx: 장고 앱에 접근하는 요청들을 관리하고 정적 페이지를 제공하는 웹 서버 (Nginx 공식문서 참고)

# nginx/nginx.conf
worker_processes auto;  # 프로세스 수를 자동 설정

events {
    worker_connections 1024;  # 최대 접근 가능한 요청 수
}

http {
    upstream djarf {
        server djarf:8000;  # 아래 proxy_pass로 전달할 포트
    }

    server {
        listen 80;  # HTTP로 접근할 경우

        location / {
            proxy_pass http://djarf;  # 위 upstream으로 요청 전달
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

Dockerfile: 도커 이미지를 생성하고 컨테이너를 만들기 위한 설정 파일

# Dockerfile
FROM python:3.8.16  # 파이썬 이미지를 DockerHub로부터 받아서 상속
WORKDIR /app  # 도커 컨테이너 가상환경 내 작업폴더 경로
COPY . /app  # Git repository 내 모든 파일을 작업폴더로 복사 = git clone

RUN pip install --upgrade pip
RUN pip install -r requirements.txt  # requirements.txt로 파이썬 라이브러리 설치

# 환경변수 지정: 장고 암호화 키, DB 비밀번호, RDS DB IP
ARG DJANGO_SECRET_KEY  # 도커 컴포즈에서 넣어줄 환경변수
ENV DJANGO_SECRET_KEY $DJANGO_SECRET_KEY  # 넣어준 환경변수를 도커 컨테이너 환경변수로 지정
ARG DB_PASSWORD
ENV DB_PASSWORD $DB_PASSWORD
ARG DB_HOST
ENV DB_HOST $DB_HOST

ENV DJARF_PROD true  # Production 용도라는 의미의 환경변수 추가, djarf/settings.py 참고
RUN mkdir logs  # 로깅을 위한 폴더 추가
RUN python manage.py collectstatic --noinput  # 배포 시 CORS 해결을 위한 static 파일 설정

EXPOSE 8000  # 도커 컨테이너의 8000번 포트를 열어줌
# gnicorn WSGI 8개 프로세스, 8개 스레드로 모든 IP에 대해 8000번 포트를 열어줌
ENTRYPOINT gunicorn --bind 0.0.0.0:8000 --workers 8 --threads 8 djarf.wsgi
# nginx/Dockerfile
FROM nginx:1.24.0

COPY nginx.conf /etc/nginx/nginx.conf

도커 컴포즈(Docker compose): 여러 도커 컨테이너를 연결하기 위한 설정 파일 (도커 컴포즈 공식 문서 참고)

# compose.yaml
version: "3"
services:
  djarf:  # 웹 애플리케이션 서비스
    build:
      context: .  # 이 폴더의 Dockerfile 실행
      args:  # 환경변수를 Dockerfile 인자로 넣어주어 도커 컨테이너의 환경변수로 설정하게 함
        DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY}
        DB_PASSWORD: ${DB_PASSWORD}
        DB_HOST: ${DB_HOST}
    image: ${ECR_URI}/djarf:latest
  server:  # 웹 서버 서비스
    build: ./nginx  # nginx/Dockerfile 실행
    image: ${ECR_URI}/djarf-server:latest  # 추후 AWS ECR에 이미지 자동 배포
    ports: [ "80:80" ]  # 80번 포트를 열어서 연결해줌
    depends_on: [ djarf ]  # djarf 서비스에 종속됨
    links: [ djarf ]  # djarf 서비스에 연결됨

도커 컴포즈를 실행하여 AWS ECS 배포

docker compose up --build  # 도커 컴포즈 컨테이너를 띄워봄

# AWS ECS CLI 설치
curl -Lo /usr/local/bin/ecs-cli https://amazon-ecs-cli.s3.amazonaws.com/ecs-cli-darwin-amd64-latest
sudo chmod +x /usr/local/bin/ecs-cli

# 도커 컴포즈 설정에 따라 AWS ECS로 배포
ecs-cli compose --file compose.yaml --project-name djarf create --cluster-config djarf
# 클러스터 생성 -> 태스크 정의를 compose.yaml로 생성 -> 서비스 생성 -> EC2 보안그룹 들어가서 변경
# 업데이트 (서비스만 가능, 태스크는 불가능)

# 설정 변경 시 업데이트
aws ecs update-service --service djarf --task-definition djarf --cluster djarf --force-new-deployment

참고한 글들

댓글