FrameWork/Django

Django에서 static, media 관리하기

JHeaon 2024. 7. 29. 10:16

 


 

static, media 폴더 관리하기

장고에서는 static, media와 같이 용도에 맞는 파일을 제공하기 위해서 settings.py에서 파일을 제공하는 경로를 비롯한 설정을 할 수 있다. 여기서 나오는 static, media의 폴더들은 다음과 같은 역할을 지닌다. 

  • static: 주로 장고에서 제공하는 정적 파일을 관리할 때 주로 사용한다. (html, css, javascript)
  • media: 유저로부터 받은 파일을 저장하거나 제공할 때 주로 사용한다. 

로컬 파일에서 static, media을 사용할 때는 프로젝트의 시작 urls.py에 static, media 경로를 입력해 사용한다. 

 

🛣️ urls.py

from django.contrib.auth import settings
from django.conf.urls.static import static

urlpatterns = [
] 

if settings.DEBUG:
	urlpatterns += tatic(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

 

 

 

 

static

웹 페이지에서 사용하는 정적파일을 관리할 때 사용한다. 

 

🧭 settings.py

STATIC_URL = "/static/"
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static")
]
  • static_url: 웹 페이지 상에서 사용할 정적 파일의 최상위 경로를 나타낸다. 
  • static_root: "python manage.py collectstatic" 명령어를 통해 모든 static file을 저장할 경로를 의미한다. 
  • staticfiles_dirs: 정적 파일들이 위치한 경로를 지정한다. 

 

 

Media

유저가 업로드한 정적파일을 관리할 때 사용한다. 

 

🧭 settings.py

MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
  • media_url: 웹 페이지 상에서 사용할 정적 파일의 최상위 경로를 나타낸다. 
  • media_root: media 파일을 저장하는 폴더의 경로를 의미한다. 

 

 

 

 

 

Nginx에서 정적, 미디어 파일 제공하기

배포를 진행하게 된다면, 정적, 미디어 파일 같은 경우에는 WAS에서 직접 제공하기보다는 앞단에 WS를 두어 WS가 정적, 미디어 파일을 제공하도록 설정해 둔다. WAS에 유저 업로드 파일이 쌓여 스토리지가 부족하지 않게 하고,  정적 파일 요청의 수를 줄여 WAS가 처리하는 요청에 대한 부담을 줄여줌으로써 좀 더 원활하게 서버가 돌아가도록 하기 위함이다.

 

✏️ WS(Web Server), WAS(Web Application Server)

 

웹 서버와 WAS (Django, Nginx, Gunicorn)

django 프로젝트를 하다 보면, gunicorn과 nginx로 배포하는 경우가 흔하다. 하지만 강의나 여러 글만 따라가면서 프로젝트를 진행했기에 gunicorn과 nginx에 대한 개념이 뚜렷하지 않다. 따라서 이에 대

jheaon.tistory.com

 

Django는 그중에서 주로 앞단에 Nginx 서버를 많이 사용하는 편이다. 따라서 Nginx, Docker을 이용하여 정적, 미디어 파일을 제공하는 실습을 해보고자 한다. 

 

docker-compos.yml 파일을 실행하기 전, "python manage.py collectstatic" 명령어를 통해 정적 파일들을 아까 정의해 둔 STATIC_ROOT파일에 모두 모아준다. 

 

🐳 docker-compose.yml

ersion: "3.8"

services:
  backend:
    build:
      context: .
    ports:
      - "8000:8000"
    volumes:
      - ./:/project/
    command: >
      sh -c "
      cd /project/ &&
      python manage.py migrate &&
      python manage.py runserver 0.0.0.0:8000"
    depends_on:
      - db

  nginx:
    image: nginx
    volumes:
      - ./config/nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./staticfiles/:/static/
      - ./media/:/media/
    ports:
      - "80:80"
    depends_on:
      - backend

  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: django_test_db
    ports:
      - "3306:3306"
    volumes:
      - volumes_db:/var/lib/mysql/

volumes:
  volumes_db:

 

 

 

 

🟢 Nginx.conf

events {
    worker_connections 1024;
}

http {

    client_max_body_size 50M;

    upstream web {
        server backend:8000;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://web;
            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 /static/;
        }

        location /media/ {
            alias /media/;
        }
    }

}

 

docker-compose을 실행하게 되면 nginx 컨테이너 안에는 static, media폴더가 각각 staticfiles, media 폴더에 마운트 된다. 그 이후 

요청을 받게 되면 nginx에서 static, media폴더에 있는 파일을 각각 제공해 주게 된다.

 

하지만 해당 방법은 WAS가 처리하는 요청에 대한 부담을 줄여주지만, 유저의 파일을 받게 되면 nginx, django 컨테이너 각각에 파일이 저장되어 스토리지 방면에서는 좋지 못하다. 따라서 실제 배포를 하게 된다면, AWS S3, Google Cloud Storaged 등등을 이용하여 처리해 주는 것이 좋다. 

 

 

🔥 추후 AWS S3, GCP Storage와 연동하게 된다면 업데이트 하겠습니다. 

 

 

 

'FrameWork > Django' 카테고리의 다른 글

장고 개발 환경에서 프로세스 2개가 실행되는 이유  (1) 2024.10.07
유저 커스텀 모델 사용하기  (0) 2024.07.29
N + 1 쿼리 문제  (0) 2024.07.10
select_related와 prefetch_related  (0) 2024.07.10
orm과 queryset  (0) 2024.07.10

'FrameWork/Django'의 다른글

  • 현재글 Django에서 static, media 관리하기

관련글