- 프로그래머스
- spring boot
- 자바
- 스프링부트
- select
- AWS
- spring mvc
- java
- 1차원 배열
- DI
- join
- @transactional
- string
- PYTHON
- spring
- 데이터베이스
- hibernate
- jpa
- Docker
- static
- ORM
- 문자열
- spring security 6
- sql
- SSL
- Django
- springboot
- 스프링
- mysql
- nginx
| 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 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로 미디어 파일 제공하기 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 문서화 (0) | 2024.01.20 | 
| [Django] 환경변수 관리 (django-environ) (1) | 2024.01.06 | 
| [Django] 개발 환경 분리 (1) | 2023.12.30 | 
| [Django / TIL] request와 requests (0) | 2023.10.30 | 
