개발하는 자몽

[Django] 배포 환경에서 Nginx로 media file 제공하기 on Docker 본문

Python/Django

[Django] 배포 환경에서 Nginx로 media file 제공하기 on Docker

jaamong 2024. 1. 13. 12:17

static file 관리

Django 프로젝트를 배포할 때 `DEBUG` 설정은 `False`로 설정하게 된다.

 

이미지가 저장된 경로로 API 요청하는 것에 대해서 `True`일 때는 `MEDIA_ROOT`와 `MEDIA_URL` 설정만 하면 이미지가 저장된 경로로 API 요청을 했을 때 200 응답을 받을 수 있다. 하지만 `False`일 때 요청을 하면 404 에러가 발생한다. 

 

static 파일 관리는 `INSTALLED_APPS`의 `django.contrib.staticfiles` 모듈이 담당하고 있는데, settings.py의 `DEBUG`를 `False`로 바꾸면 동작하지 않는다. 따라서 static 파일의 처리는 Apache나 Nginx와 같은 웹 서버가 담당하게 된다.

 

관련 내용은 여기를 참고하자.

 

media file 제공

nginx를 통해서 미디어 파일을 제공하는 방법은 매우 간단하다. (너무 간단해서 처음 알아봤을 때 좀 의심스러웠다..ㅎ)

nginx.conf 

..

http {
	...

    server {
		
        ...

        # media setting
        location /media/ {
            alias /media/;
        }
        ...
    }
}

클라이언트가 /media/temp.png 와 같은 파일을 요청할 경우, Nginx 컨테이너 내부의 /media/ 아래(alias 경로)에서 파일을 찾아 클라이언트에게 전송한다. 

 

 

🔹location

 

  • Nginx 웹 서버를 연결하는 경로를 설정하는 것
  • `location`에서 경로를 설정할 때, `root`와 `alias`가 자주 사용됨

 

🔹root

아래와 같이 root를 사용하는 경우, nginx 웹 서버는 /var/www/project/text의 경로에서 파일을 탐색한다.

```
location /test/ {
	root /var/www/project/;
}
```

 

 

🔹alias

아래와 같이 alias를 사용하는 경우, nginx 웹 서버는 /var/www/project/의 경로에서 파일을 탐색한다. (/test/ 무시)

location /test/ {
	alias /var/www/project/;
}

 

docker-compose.yml

기존에 Django 서버와 Nginx를 Docker 컨테이너로 실행하고 있었기 때문에 docker-compose.yml을 수정해 준다. 아래 파일은 지난번 로드밸런싱 포스팅의 코드에서 Nginx의 미디어 파일 관련된 코드가 추가된 버전이다.

version: "3.5"

services:
  _build_image:
    image: ...
    build: .
    
  server1: 
    image: ...
    restart: always
    command: python ... runserver 0.0.0.0:4100
    ports:
      - "4100" 
    depends_on:
      - _build_image
    volumes:
      - media-vol:/server/server/media/  # nginx에서 media를 사용할 수 있도록 volume 지정

  server2: 
    image: ...
    restart: always
    command: python ... runserver 0.0.0.0:4100
    ports:
      - "4100" 
    depends_on:
      - _build_image
    volumes:
      - media-vol:/server/server/media/  # nginx에서 media를 사용할 수 있도록 volume 지정

  nginx:
    image: nginx   
    build: ./nginx 
    volumes: 
      - ./nginx.conf:/etc/nginx/nginx.conf:ro 
      - media-vol:/media/  # django의 media를 사용할 수 있도록 volume 지정
    depends_on:
      - server1
      - server2
    ports:
      - "4100:80"
      
volumes:
  media-vol:
    external: true

 

 

 

Comments