django app을 공개 하기 위해 aws 계정을 만들고 프리티어 계정을 이용해 ec2 인스턴스에 환경 세팅을 하던 중 nginx 와 django app을 별도의 컨테이너로 운영 하고 싶어져 해당 내용을 정리 해본다.

 

즉 nginx,, django app, db server 를 각각 하나의 컨테이너로 분리해 아래 그림과 같이 container 1, container 2, container 3 으로 나누어 운영하는 것이다. 

(이외에도 분리 과정 중에 격었던 에러와 해결 방법을 [Django] nginx 와 django container 분리 에러 해결 페이지에 추가 정리 했다.)

Fig 1. 운영 개요도

 

 

이렇게 하려고 하다 보니 생기는 문제가 static 파일들을 어떻게 nginx 와 django app이 실행되는 container 에 모두 연결 할수 있는가 였다. 사실 어려운 문제는 아니지만 웹 운영에 익숙치 않는 나의 얕은 지식에서 비롯된 문제 였다.

 

내가 처음 헷갈렸던 문제는 다음과 같다.

이슈 1. container 1(nginx)와 container 2(django app)이 접근 또는 사용 하는 static 파일들은 물리적으로 같은게 좋은건가? 각각 동일한 파일들을 복사해서 따로 사용 하는게 좋은 걸까?

Answer: 실제 운영 환경에서 어떤지는 잘 모르겠다. 다만 static 파일이 다르면 django app에서 물리 파일이 추가/변경 될때 마다 nginx가 참조 하는 static 파일들을 django app의 최신 파일들과 싱크를 맞추는 과정이 필요하다.

 

이슈 2. container 1(nginx) 와 container 2(django app) 내에서 static 파일들의 절대 경로가 같아야 하는가?

Answer: 이럴 필요 전혀 없었다.

nginx 를 실행 하는 container 상의 staticfile 위치와 django app 실행 하는 container 내의 staticfile 위치는 달라도 된다.

 

 

Container 분리를 위한 과정 및 설정

1. django app settings.py(내 경우 config/settings/prod.py 파일) 에 STATIC_ROOT=./staticfiles 를 파일 맨 밑에 추가.

django 에서 static 파일과 관련된 django setting.py 내의 변수들은 대략 5가지 인데 3가지만 정리 우선 정리 하면
1. STATIC_URL: 웹페이지에서 사용할 정적 파일들의 최상위 URL 경로. 실제 파일들의 물리적인 위치가 아니며 개념적인 경로로이고 반드시 '/'로 끝나야 한다.
2. STATICFILES_DIRS: 개발 단계에서 사용하는 정적(static)파일이 존재 하는 위치하는 경로를 설정하는 항목. 운영시에도 django app은 여기 정의된 위치에서 static 파일을 참조 한다고 한다.
3. STATIC_ROOT:django app에서 사용하는 모든 정적파일들이 모여 있는 디렉토리로 아래 collectstatic 명령 사용시 정적파일들이 복사 되는 위치이기도 하다.

2. 아래 명령을 실행해 static 파일들을 한 directory 에 모은다.

 python manage.py collectstatic

 

3. 이 directory 를 nginx container로 mount 하고 nginx server 설정 파일(django_app_server)에서 내 서버로 들어오는 요청이 static 파일 참조가 필요할 경우 mount한 위치에서 static 파일을 찾도록 아래와 같이 내용 변경.

upstream django_app{
        server 192.168.0.102:8000;
}
server {
        listen 80;
        server_name 192.168.0.102; ##client 가 접속하는 도메인네임, 장고 app 의 서버 주소

        location = /favicon.ico { access_log off; log_not_found off; }

        location /static {
                alias /home/nginx/www/static; ##docker compose 에서 volume 마운트 한 static 파일의 위치를 여기에 설정
        }

        location / {
                include proxy_params;
                proxy_pass http://django_app; # static 이 아닌 요청은 jnbdrive_app upstream 으로 요청 포워딩
        }
}

 

아래는 docker-compose.yml 파일이다. django_app_server 설정 파일과 staticfiles 파일의 마운트 위치를 잘 살펴 보자.

staticfiles은 nginx container의 /home/nginx/www/static 위치에 마운트 했고 이 이 위치를 django_app_server 설정에서 참조하도록 했다.

version: "3.7"
services:
  nginx:                 
    container_name: nginx
    restart: on-failure
    image: nginx:stable
    volumes:
      - ${PWD}/etc/django_app_server:/etc/nginx/sites-enabled/default # django app server 설정파일
      - ${PWD}/etc/nginx.conf:/etc/nginx/nginx.conf:ro
      - ${PWD}/etc/proxy_params:/etc/nginx/proxy_params  
      - ${PWD}/staticfiles:/home/nginx/www/static # <--- 이 라인이 static 파일을 마운트 하는 라인이다.
       
    ports:
      - 80:80
      - 443:443
    environment:
      DJANGO_HOST: jnb_web
    depends_on:
      - jnb_web

- 끝-

 

+ Recent posts