본문 바로가기
[Back-End]/[Error]

[AWS Lightsail] 배포서버에서 정적파일이 로드되지 않음(feat.runserver,Nginx & Gunicorn)

by Yong9_9 2023. 11. 12.

원인

  • 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 을 함께 사용하여 배포해보도록 한다.

참고 내용

Debug=False 일 때, 발생할 수 있는 오류

Django runserver는 왜 배포 때 쓰면 안될까?

Nginx, Gunicorn이란 무엇인가? feat. Django

댓글