원인
- DEBUG = False 하게 되면 settings에 있는 Static과 Media 폴더 경로를 사용할 수 없게 된다.
❓ DEBUG = True로 설정하여 배포하면 되지 않을까?
- DEBUG = True를 설정하면 Django에서 에러가 났을 때 에러에 대한 자세한 내용이 페이지에 표시되는데 이런 내용들은 배포됐을 때 보안에 굉장히 취약해진다
해결방법
python3 manage.py runserver 0:8000 - -insecure
- 위와 같은 명령어를 입력하면 DEBUG = False상태에서 static 파일에 접근할 수 있게 된다
- 하지만 media 파일은 여전히 불러오지 않는다.
# 프로젝트 폴더 / urls.py
from django.views.static import serve
from django.urls import re_path
url(r'^media/(?P<path>.*)$',
serve, {'document_root': settings.MEDIA_ROOT}),
- 위 코드를 추가하면 media 파일도 잘 불러오는 것을 확인할 수 있다.
알게 된 점
Django는 친절하게 코드 내 주석과 공식 문서를 통해 runserver를 PRODUCTION 환경에서 쓰지말라고 알려준다.
- 사실 runserver 로 배포하는 것은 올바르지 않다는 것.
- 보안 감사나 성능 테스트를 거치지 않는다
- 기능이 단순하고 대량 요쳥이나 동시 요청을 효율적으로 처리하지 못한다
이러한 이유들로 runserver 로 배포하는것은 보안적, 성능적으로 효율적이지 못하므로 배포 시에는 별도의 웹 서버가 필요하다는 것.
그러면 어떤 방식으로 배포하라고??
- 안전하고 안정적인 서버 운영을 하고 싶으면 Apache나 Nginx로 웹서버를 설정하여 운영하는 것이 정석이다.
Nginx와 Gunicorn
- 보통 Nginx와 Gunicron을 같이 사용한다고 한다.
쉽게 설명하면 Nginx == 웹서버 Gunicron == WSGI 라고 한다.
그럼 WSGI가 뭐지?
WSGI는 파이썬 스크립트가 웹서버와 효율적으로 통신하기 위해 만들어진 인터페이스 라고 한다.
조금 더 쉽게 설명하면 WSGI 서버는 웹서버가 동적 페이지 요청을 처리하기 위해 호출하는 서버이다.
마무리
- Nginx와 Gunicorn을 함께 사용하면 runserver를 사용하는 것에 비해 안정성과 성능을 개선할 수 있다고 한다.
- 이번 프로젝트는 배포 자체에 목적을 두었으므로 배포 했다는 것에 의미를 두자.
- 다음 프로젝트 배포시에는 runserver가 아닌 Nginx와 Gunicorn 을 함께 사용하여 배포해보도록 한다.
댓글