- 데이터베이스
- sql
- 자바
- SSL
- jpa
- Docker
- spring boot
- 프로그래머스
- spring mvc
- 1차원 배열
- 스프링부트
- ORM
- spring security 6
- Django
- DI
- spring
- string
- select
- mysql
- nginx
- AWS
- PYTHON
- 문자열
- @transactional
- java
- springboot
- session
- Git
- 스프링
- join
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
개발하는 자몽
[Django] 배포 환경에서 Nginx로 media file 제공하기 on Docker 본문
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
'Python > Django' 카테고리의 다른 글
[Django / TIL] ORM 쿼리 메서드 filter(), get() (0) | 2024.01.29 |
---|---|
[Django] Swagger를 이용한 API Documentation (0) | 2024.01.20 |
[Django] 환경변수 관리 (django-environ) (1) | 2024.01.06 |
[Django] 개발 환경 분리 (1) | 2023.12.30 |
[Django / TIL] request와 requests (0) | 2023.10.30 |