Nginx 적용하기

Posted on 2021-08-25 by GKSRUDTN99
Django로 웹사이트 만들기 장고

앞에서 -v 옵션을 통해 volume들을 삭제했으므로, 정적 파일이 제대로 적용되어 있지 않다.
이를 Nginx를 통해 해결해보자.


컨테이너에 Nginx 설정 추가하기

docker-compose.yml을 다음과 같이 수정한다.

# docker-compose.yml
version: '3'

services:
  nginx:
    build: ./nginx
    volumes:
      - static_volume:/usr/src/app/_static
      - media_volume:/usr/src/app/_media
    ports:
      - 80:80
    depends_on:
      - web
  web:
    build: .
    command: gunicorn do_it_django_prj.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - static_volume:/usr/src/app/_static
      - media_volume:/usr/src/app/_media
      - ./:/usr/src/app/
    expose:
      - 8000
    env_file:
      - ./.env.prod
    depends_on:
      - db
  db:
    image: postgres:12.0-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    env_file:
      - ./.env.prod.db

volumes:
  postgres_data:
  static_volume:
  media_volume:

build: ./nginx

nginx 컨테이너를 만들기 위한 파일을 넣을 nginx 폴더를 만듭니다.

volumes

컨테이너가 종료되면 컨테이너 안에 저장되어 있던 내용도 함께 사라지는데, Nginx의 volume 기능을 이용해 저장하면 컨테이너를 다시 실행했을 때 바로 불러올 수 있다.

ports:

http 표준이 80번 포트를 사용한다.

expose:

장고에서 처리한 결과는 8000번 포트로 expose 하도록 변경한다. 8000번 포트로 web 컨테이너와 nginx 컨테이너가 정보를 주고받도록 한다.

nginx 폴더 만들기

nginx 폴더를 만들고, 그 안에 Dockerfile을 새로 만든다.

# nginx/Dockerfile
FROM nginx:latest
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d

FROM nginx:latest

도커가 제공하는 Nginx 이미지 중 최신 버전을 사용합니다.

RUN rm /etc/nginx/conf.d/default.conf

이미지 안의 default.conf에는 도커가 제공하는 Nginx의 기본 설정값이 들어있는데, 이를 삭제한다.

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

대신 로컬에 새로 만든 conf.d를 Nginx 이미지 안에 복사해 넣는다.

nginx.conf 파일 작성하기

# nginx/nginx.conf
upstream do_it_django {
    server web:8000;
}

server {
    listen 80;
    location / {
        proxy_pass http://do_it_django;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

    location /static/ {
        alias /usr/src/app/_static/;
    }

    location /media/ {
        alias /usr/src/app/_media/;
    }
}

장고 쪽에서 proxy_pass를 통해 nginx로 오는 내용은 8000번 포트로 받고,
외부에서 오는 요청은 80으로 받도록 설정한다.
/media/나 /static/으로 접근하는 경우에 파일을 제공할 수 있도록 static과 media 파일이 있는 위치를 적는다.


도커 실행

docker-compose down

docker-compose up

docker-compose exec web python manage.py collectstatic