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 파일이 있는 위치를 적는다.